我需要同步在主队列上调度一个块.我不知道我目前是在主线程上运行还是不运行.天真的解决方案看起来像这样:
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)
这有效,但很难看.在我至少将它隐藏在一些自定义功能之前,是不是有更好的解决方案来解决这个问题?我强调我不能异步调度块 - 应用程序处于异步调度块将"执行得太晚"的情况.
我正在尝试构建一个批量图像下载器,可以将图像动态添加到队列中进行下载,我可以找到进度以及何时完成下载.
通过我的阅读,似乎NSOperationQueue对于队列功能和NSURLSession网络功能似乎是我最好的选择,但我很困惑如何使用这两个串联.
我知道我想补充的情况下,NSOperation在NSOperationQueue他们得到排队.似乎我创建了一个下载任务NSURLSessionDownloadTask,如果我需要多个任务,我会创建多个任务,但我不确定如何将两者放在一起.
NSURLSessionDownloadTaskDelegate 似乎拥有下载进度和完成通知所需的所有信息,但我还需要能够停止特定下载,停止所有下载,并处理从下载中获取的数据.
Apple的Grand Central Dispatch参考文献称:
"......如果你的应用程序需要在系统的Unix级别运行 - 例如,如果它需要操作文件描述符,Mach端口,信号或定时器.GCD不仅限于系统级应用程序,而是在你之前将它用于更高级别的应用程序时,您应该考虑Cocoa中提供的类似功能(通过NSOperation和块对象)是否更易于使用或更适合您的需求."
对于高级应用程序,我实际上无法想到这种情况,其中GCD的使用是强制性的,并且可以/不应该使用NSOperation.
有什么想法吗?
concurrency objective-c grand-central-dispatch ios objective-c-blocks
哪些任务更适合使用NSOperation,而不是GCD在为iPhone编程时使用?
对我来说,他们似乎做同样的事情.我看不出一方面的优势和劣势.
正如标题所示,NSOperationQueue的maxConcurrentOperationCount的默认值是多少?
是否设置为1的值?
当你需要在网络任务或操作的完成块中的主线程上执行某些操作时,哪种方式获取它将是最合适的,为什么?:
OperationQueue.main.addOperationDispatchQueue.main.async我是GCD和线程的新手.我已经完成了教程并且非常困惑.有人可以用简单的话来解释.请不要建议苹果开发者链接..
提前致谢 !
iphone multithreading nsoperationqueue grand-central-dispatch nsinvocation
我正在深入了解并发性,并且已经广泛阅读了关于GCD和NSOperation.然而,许多帖子,如SO上的标准答案都已有几年了.
在我看来,过去的NSOperation主要优势是以某些性能为代价:
由于GCD的DispatchWorkItem&块取消/ DispatchGroup/ qos特别是有一个真正的激励(性价比明智)使用NSOperation时就开始执行或查询任务状态再从那里,你需要能够取消任务的情况下并发分开?
苹果公司似乎更加重视GCD,至少在他们的WWDC中(授予它更近NSOperation).
有时我必须在主线程上做一些事情,建议将代码放在OperationQueue.main.addOperation。
其他时候,建议在其中编写代码DispatchQueue.main.async。
两者之间有什么区别?
(有一个类似的问题标题,但是内容不匹配。)
我有一个方法,如:
- (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)
如何实现?
我正在使用GCD从互联网上进行一些后台加载.除了有点瑕疵之外,这很有效.在我的应用程序中,我有3个选项卡,当单击任何选项卡时,GCD开始为相应的选项卡执行后台加载.如果用户决定从第一个选项卡转到第二个选项卡(当GCD开始下载第一个选项卡的数据时),然后再次返回第一个选项卡.GCD将启动另一个后台线程(即使第一个后台线程尚未完成下载数据).
那么有没有办法检查后台线程当前是否正在运行?因此,如果用户选择非常快速地来回切换标签(由于某种原因),它就不会启动多个后台线程.
使用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) ios ×11
objective-c ×6
nsoperation ×4
iphone ×3
swift ×3
cocoa-touch ×2
asynchronous ×1
beta ×1
concurrency ×1
flurry ×1
nsinvocation ×1
nsurlsession ×1
operation ×1
queue ×1
ui-thread ×1
xcode ×1