Tag: grand central dispatch

我怎样才能从ios5更换不推荐使用的方法dispatch_get_current_queue()在iPhone?

我正在IOS 5中使用xmppframework开发一个聊天应用程序; 它完美的作品。 但我更新了我的xcode到4.5.1,ios5到IOS 6和我的mac OS到10.7.5,由于不推荐使用的问题,该项目不起作用。 我用ios 6中的新方法replace所有的方法,除了这个: dispatch_get_current_queue() 我如何在IOS 6中replace这个方法?

我如何validation我在给定的GCD队列上运行而不使用dispatch_get_current_queue()?

最近,我需要一个函数来保证特定串行调度队列上给定块的同步执行。 有可能这个共享函数可以从已经在那个队列上运行的东西中调用,所以我需要检查这种情况,以防止从同步调度到同一队列的死锁。 我使用如下代码来做到这一点: void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)) { dispatch_queue_t videoProcessingQueue = [GPUImageOpenGLESContext sharedOpenGLESQueue]; if (dispatch_get_current_queue() == videoProcessingQueue) { block(); } else { dispatch_sync(videoProcessingQueue, block); } } 这个函数依赖于使用dispatch_get_current_queue()来确定这个函数正在运行的队列的身份,并将其与目标队列进行比较。 如果有一个匹配,它知道只是在没有派发到该队列的情况下内联运行该块,因为该函数已经在其上运行。 我曾经听说过是否使用dispatch_get_current_queue()来进行比较是正确的,我在头文件中看到了这个字眼: build议仅用于debugging和logging目的: 代码不能对返回的队列做任何假设,除非它是全局队列或代码本身创build的队列之一。 如果该队列不是由dispatch_get_current_queue()返回的队列,则代码不能假定队列上的同步执行是安全的。 此外,在iOS 6.0(但尚未山狮),GCD标头现在标记为不推荐使用此function。 这听起来像我不应该以这种方式使用这个函数,但我不知道我应该用什么来代替它。 对于像上面那样针对主队列的函数,我可以使用[NSThread isMainThread] ,但是如何检查我是否在我的自定义串行队列中运行,以便可以防止死锁?

无法访问dispatch_async中的全局variables:“Variable is not Assignable(missing _block type specifier)”

在我的dispach_async代码block我无法访问global variables 。 我得到这个错误Variable is not Assignable (missing _block type specifier) 。 NSString *textString; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long)NULL), ^(void) { textString = [self getTextString]; }); 任何人都可以帮我找出原因吗?

主队列上的dispatch_sync与dispatch_async

忍受着我,这是要解释一下。 我有一个如下所示的函数。 上下文:“aProject”是一个名为LPProject的核心数据实体,其中包含名为“memberFiles”的数组,其中包含另一个名为LPFile的Core Data实体的实例。 每个LPFile代表磁盘上的一个文件,我们想要做的就是打开这些文件并parsing它的文本,寻找指向OTHER文件的@import语句。 如果我们find@import语句,我们希望find它们指向的文件,然后通过向表示第一个文件的核心数据实体添加一个关系来将该文件“链接”到这个文件。 由于所有这些都可能需要一些时间在大文件上,我们将使用GCD从主线程执行。 – (void) establishImportLinksForFilesInProject:(LPProject *)aProject { dispatch_queue_t taskQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); for (LPFile *fileToCheck in aProject.memberFiles) { if (//Some condition is met) { dispatch_async(taskQ, ^{ // Here, we do the scanning for @import statements. // When we find a valid one, we put the whole path to the imported […]

你需要在GCD块中创build一个NSAutoreleasePool吗?

通常情况下,如果你产生一个后台线程或在NSOperationQueue上运行一个NSOperation,你需要为该线程或操作创build一个NSAutoreleasePool,因为默认情况下不存在。 相同的规则是否适用于位于Grand Central Dispatch队列中并将在非主线程上运行的块? 也就是说,是否需要在每个块中创build一个NSAutoreleasePool,然后将其分派给主队列以外的任何其他块? 在我有限的testing中,我没有看到通常用后台线程或NSOperation看到的自动释放对象的控制台警告。 但是,我似乎无法find明确的文件,所以我想知道是否有人可以指出这是说。

在Swift中如何调用带有GCD主线程参数的方法?

在我的应用程序,我有一个函数,使一个NSRURLSession并发出一个NSURLRequest使用 sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error) 在这个任务的完成块中,我需要做一些计算,将UIImage添加到调用viewcontroller。 我有一个func叫 func displayQRCode(receiveAddr, withAmountInBTC:amountBTC) 这是UIImage添加计算。 如果我尝试在完成块中运行视图添加代码,Xcode会抛出一个错误,说我在后台进程中不能使用布局引擎。 所以我在SO上发现了一些代码,试图在主线程上排队一个方法: let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.0 * Double(NSEC_PER_MSEC))) dispatch_after(time, dispatch_get_main_queue(), { let returned = UIApplication.sharedApplication().sendAction("displayQRCode:", to: self.delegate, from: self, forEvent: nil) }) 但是,我不知道如何在这个函数调用中添加参数“receiveAddr”和“amountBTC”。 我该怎么做,或者可以有人build议一个方法调用添加到应用程序的主要队列的最佳方式?

NSOperation与大中央调度

我正在学习iOS的并发编程。 到目前为止,我已经读过NSOperation / NSOperationQueue和GCD 。 使用NSOperationQueue的原因是什么,反之亦然? 听起来像GCD和NSOperationQueue抽象的从用户显式创buildNSThreads 。 然而这两种方法之间的关系对我来说是不清楚的,所以任何反馈都要赞赏!

iOS 6中完成块的dispatch_get_current_queue()的替代方法?

我有一个方法,接受一个块和一个完成块。 第一个块应该在后台运行,而完成块应该在该方法被调用的任何队列中运行。 对于后者,我总是使用dispatch_get_current_queue() ,但似乎在iOS 6或更高版本中已被弃用。 我应该用什么来代替?

为什么我们不能在当前队列上使用dispatch_sync?

我遇到了一个场景,我有一个委托callback可能发生在主线程或另一个线程,我不知道哪些,直到运行时(使用StoreKit.framework )。 我还有需要在函数执行前需要更新的UI代码,所以我最初的想法是有这样一个函数: -(void) someDelegateCallback:(id) sender { dispatch_sync(dispatch_get_main_queue(), ^{ // ui update code here }); // code here that depends upon the UI getting updated } 当它在后台线程上执行时效果很好。 但是,当在主线程上执行时,程序会发生死锁。 这一点对我来说似乎很有趣,如果我阅读dispatch_sync文档,那么我会期望它完全执行该块,而不必担心将其安排到runloop中,如下所述: 作为优化,该函数尽可能地调用当前线程上的块。 但是,这并不是什么大不了的事情,它只是意味着更多的打字,这使我有了这种方法: -(void) someDelegateCallBack:(id) sender { dispatch_block_t onMain = ^{ // update UI code here }; if (dispatch_get_current_queue() == dispatch_get_main_queue()) onMain(); else dispatch_sync(dispatch_get_main_queue(), onMain); } 但是,这似乎有点倒退。 […]

最后先进出栈与GCD?

我有一个UITableView显示图像与每一行中的联系人。 在某些情况下,这些图像在地址簿联系人图像的第一个显示中被读取,并且在没有一个的情况下,这些图像是基于存储的数据呈现的化身。 我目前正在使用GCD在后台线程上更新这些图像。 但是,这会按照请求的顺序加载图像,这意味着在快速滚动队列过程中会变得冗长,并且当用户停止滚动时,当前单元格将被更新。 在iPhone 4上,问题不是很明显,但我热衷于支持旧的硬件,并在iPhone 3G上进行testing。 延迟是可以忍受的,但相当明显。 这让我觉得后进先出栈似乎可以很大程度上解决这个问题,因为每当用户停止滚动这些单元格将是下一个被更新,然后当前在屏幕外的其他将被更新。 Grand Central Dispatch有这种可能吗? 或者执行一些其他方式不是太繁重? 请注意,顺便说一下,我正在使用核心数据与SQLite存储,我没有使用NSFetchedResultsController 由于多对多的关系,必须遍历为了加载这个视图的数据。 (据我所知,这排除了使用NSFetchedResultsController。) [我发现一个NSFetchedResultsController可以使用多对多的关系,尽pipe官方文档似乎说。 但是我在这方面还没有用到。] 补充:只是要注意,虽然话题是“如何用GCD创build最后的先入栈”,但实际上我只是想解决上面提到的问题,可能有更好的办法。 我更愿意接受像蒂蒙托曼那样的解决以另一种方式概括的问题的build议。 如果这样的build议终于是我使用的,我会认识到最初的问题的最佳答案,以及我最终实现的最佳解决scheme… 🙂