Tag: grand central dispatch

我为什么要selectGCD而不是NSOperation,并为高级应用程序块?

苹果的Grand Central Dispatch参考说: “…如果您的应用程序需要在系统的Unix级别上运行 – 例如,如果需要操作文件描述符,Mach端口,信号或定时器,GCD不限于系统级应用程序,而是在您之前将它用于更高级别的应用程序,您应该考虑Cocoa中提供的类似function(通过NSOperation和块对象)是否更容易使用或更适合您的需求。“ http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html 我实际上不能想到高级应用的情况,在这种情况下,GCD的使用是强制性的,NSOperation可以/不应该使用。 有什么想法吗?

有没有办法实现dispatch_cancel()?

到目前为止,我已经通过了GCD的文档,但是它似乎没有dispatch_cancel(),我想用它来取消所有调度块的调用。 有没有办法实现dispatch_cancel()?

阻止执行dispatch_after()后台任务

这是我的问题。 当我的应用程序进入后台,我希望它在一段时间后执行一个function。 这就是我所做的: – (void)applicationDidEnterBackground:(UIApplication *)application { isRunningInBackground = YES; taskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]; int64_t delayInSeconds = 30; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { [self doSomething]; }); } – (void)doSomething { NSLog(@"HELLO"); } taskIdentifiervariables在myAppDelegate.h文件中声明如下: UIBackgroundTaskIdentifier taskIdentifier; 一切都按照预想的那样工作,我看到控制台在30秒之后就打印了HELLO。 但是如果应用程序进入前景,直到30秒结束,我不想要执行某些操作。 所以我需要取消它。 这是我如何做到这一点: – (void)applicationWillEnterForeground:(UIApplication *)application { isRunningInBackground = NO; [self […]

Objective-C,使用UI事件取消一个调度队列

场景: 用户点击一个button,要求在地址簿上进行某种修改。 调用一个方法来启动这个修改,并显示一个alert视图。 为了显示警报视图并保持UI的响应,我使用了dispatch_queue: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ dispatch_sync(dispatch_get_main_queue(), ^{ // Show the alert view }); }); 使用以下命令启动通讯录修改过程: dispatch_async(modifyingAddressBookQueue, ^{}); 现在,我想提供用户随时取消进程的能力(当然在保存地址簿之前)。 所以当他点击警报表中的取消button时,我想访问调度块,设置一些特定的BOOL来停止进程并恢复地址簿。 问题是,你不能这样做! 您不能访问该块并更改其中的任何variables,因为所有variables只被复制一次。 在执行过程中块内部的任何variables变化都不会被块看到。 总结:如何使用UI事件停止正在进行的操作? 更新: 该过程的代码: – (void) startFixingModification { _fixContacts = YES; __block BOOL cancelled = NO; dispatch_queue_t modifyingAddressBookQueue; modifyingAddressBookQueue = dispatch_queue_create(sModifyingAddressBookQueueIdentifier, NULL); dispatch_async(modifyingAddressBookQueue, ^{ for (NSMutableDictionary *contactDictionary in _contactArray) { if (!cancelled) […]

最后先进出栈与GCD?

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