相关疑难解决方法(0)

如何在没有死锁的情况下同步调度主队列?

我需要同步在主队列上调度一个块.我不知道我目前是在主线程上运行还是不运行.天真的解决方案看起来像这样:

dispatch_sync(dispatch_get_main_queue(), block);
Run Code Online (Sandbox Code Playgroud)

但是如果我当前在主队列上运行的块中,则此调用会产生死锁.(同步调度等待块完成,但块甚至没有开始运行,因为我们正在等待当前块完成.)

显而易见的下一步是检查当前队列:

if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
    block();
} else {
    dispatch_sync(dispatch_get_main_queue(), block);
}
Run Code Online (Sandbox Code Playgroud)

这有效,但很难看.在我至少将它隐藏在一些自定义功能之前,是不是有更好的解决方案来解决这个问题?我强调我不能异步调度块 - 应用程序处于异步调度块将"执行得太晚"的情况.

objective-c grand-central-dispatch ios objective-c-blocks

62
推荐指数
1
解决办法
2万
查看次数

iOS应用程序的操作队列与调度队列

  1. Operation Queue和Dispatch Queue有什么区别?
  2. 在什么情况下使用它们更合适?

iphone cocoa-touch objective-c grand-central-dispatch ios

53
推荐指数
3
解决办法
2万
查看次数

如何在NSURLSession中使用NSOperationQueue?

我正在尝试构建一个批量图像下载器,可以将图像动态添加到队列中进行下载,我可以找到进度以及何时完成下载.

通过我的阅读,似乎NSOperationQueue对于队列功能和NSURLSession网络功能似乎是我最好的选择,但我很困惑如何使用这两个串联.

我知道我想补充的情况下,NSOperationNSOperationQueue他们得到排队.似乎我创建了一个下载任务NSURLSessionDownloadTask,如果我需要多个任务,我会创建多个任务,但我不确定如何将两者放在一起.

NSURLSessionDownloadTaskDelegate 似乎拥有下载进度和完成通知所需的所有信息,但我还需要能够停止特定下载,停止所有下载,并处理从下载中获取的数据.

objective-c nsoperation nsoperationqueue ios nsurlsession

53
推荐指数
3
解决办法
3万
查看次数

为什么我应该选择GCD而非NSOperation并阻止高级应用程序?

Apple的Grand Central Dispatch参考文献称:

"......如果你的应用程序需要在系统的Unix级别运行 - 例如,如果它需要操作文件描述符,Mach端口,信号或定时器.GCD不仅限于系统级应用程序,而是在你之前将它用于更高级别的应用程序时,您应该考虑Cocoa中提供的类似功能(通过NSOperation和块对象)是否更易于使用或更适合您的需求."

http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

对于高级应用程序,我实际上无法想到这种情况,其中GCD的使用是强制性的,并且可以/不应该使用NSOperation.

有什么想法吗?

concurrency objective-c grand-central-dispatch ios objective-c-blocks

31
推荐指数
2
解决办法
2万
查看次数

哪些任务比GCD更适合NSOperation?

哪些任务更适合使用NSOperation,而不是GCD在为iPhone编程时使用?

对我来说,他们似乎做同样的事情.我看不出一方面的优势和劣势.

cocoa-touch nsoperation grand-central-dispatch ios

29
推荐指数
3
解决办法
9026
查看次数

NSOperationQueue的默认值maxConcurrentOperationCount

正如标题所示,NSOperationQueue的maxConcurrentOperationCount的默认值是多少?

是否设置为1的值?

objective-c nsoperation nsoperationqueue ios

26
推荐指数
1
解决办法
8533
查看次数

OperationQueue.main vs DispatchQueue.main

当你需要在网络任务或操作的完成块中的主线程上执行某些操作时,哪种方式获取它将是最合适的,为什么?:

  • OperationQueue.main.addOperation
  • DispatchQueue.main.async

ui-thread nsoperationqueue grand-central-dispatch ios swift

23
推荐指数
3
解决办法
1万
查看次数

Dispatch Queue和NSOperationQueue之间的区别

我是GCD和线程的新手.我已经完成了教程并且非常困惑.有人可以用简单的话来解释.请不要建议苹果开发者链接..

提前致谢 !

iphone multithreading nsoperationqueue grand-central-dispatch nsinvocation

13
推荐指数
1
解决办法
2万
查看次数

2017/Swift 3.1 - GCD vs NSOperation

我正在深入了解并发性,并且已经广泛阅读了关于GCD和NSOperation.然而,许多帖子,如SO上的标准答案都已有几年了.

在我看来,过去的NSOperation主要优势是以某些性能为代价:

  • "走的路"通常不仅仅是一个简单的调度作为最高级别的抽象(建立在GCD之上)
  • 使任务操作(取消等)更容易
  • 轻松设置任务之间的依赖关系

由于GCD的DispatchWorkItem&块取消/ DispatchGroup/ qos特别是有一个真正的激励(性价比明智)使用NSOperation时就开始执行或查询任务状态再从那里,你需要能够取消任务的情况下并发分开?

苹果公司似乎更加重视GCD,至少在他们的WWDC中(授予它更近NSOperation).

nsoperation grand-central-dispatch ios swift

9
推荐指数
1
解决办法
1102
查看次数

SWIFT-OperationQueue.main.addOperation和DispatchQueue.main.async有什么区别?

有时我必须在主线程上做一些事情,建议将代码放在OperationQueue.main.addOperation

其他时候,建议在其中编写代码DispatchQueue.main.async

两者之间有什么区别?

(有一个类似的问题标题,但是内容不匹配。)

queue asynchronous operation swift dispatch-queue

5
推荐指数
1
解决办法
334
查看次数

iOS:如何在后台线程中努力处理数据?

我有一个方法,如:

- (BOOL)shouldDoSomeWork {
   BOOL result = // here I need do hard work with data in background thread and return result, so main thread should wait until the data is calculated and then return result;
   return result;
}
Run Code Online (Sandbox Code Playgroud)

如何实现?

multithreading ios

3
推荐指数
2
解决办法
685
查看次数

使用Grand Central Dispatch,如何检查是否已经运行了一个块?

我正在使用GCD从互联网上进行一些后台加载.除了有点瑕疵之外,这很有效.在我的应用程序中,我有3个选项卡,当单击任何选项卡时,GCD开始为相应的选项卡执行后台加载.如果用户决定从第一个选项卡转到第二个选项卡(当GCD开始下载第一个选项卡的数据时),然后再次返回第一个选项卡.GCD将启动另一个后台线程(即使第一个后台线程尚未完成下载数据).

那么有没有办法检查后台线程当前是否正在运行?因此,如果用户选择非常快速地来回切换标签(由于某种原因),它就不会启动多个后台线程.

iphone objective-c grand-central-dispatch ios

2
推荐指数
1
解决办法
1884
查看次数

iOS Flurry:从后台线程调用的UI API

使用xcode 9.3 beta实现乱码会导致在后台线程上调用UI API的警告.必须仅从主线程调用.

知道怎么做才能避免这种情况 - 只是为了解决这个问题吗?

app delegate中使用的代码:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let builder = FlurrySessionBuilder.init()
                                      .withAppVersion("1.0")
                                      .withLogLevel(FlurryLogLevelAll)
                                      .withCrashReporting(true)
                                      .withSessionContinueSeconds(10)

    // Replace YOUR_API_KEY with the api key in the downloaded package
    Flurry.startSession("YOUR_API_KEY", with: builder)
    return true
}
Run Code Online (Sandbox Code Playgroud)

beta xcode flurry ios

2
推荐指数
1
解决办法
5049
查看次数