Tag: concurrency

IOS大中央调度与callback方法

我没有使用GCD或multithreading在我的应用程序,但我遇到了一种情况,我需要运行一个或两个方法closures另一个线程。 一旦这个方法完成,我需要从callback中使用主线程调用另一个方法。 我一直在寻找如何检测线程何时完成操作,但仍然不太清楚的主题。 我创build了一个testing应用程序,并使用viewDidLoad方法作为一个简单的例子。 – (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ NSLog(@"viewDidLoad called"); sleep(5); // simulating a thread being tied up for 5 seconds dispatch_async(dispatch_get_main_queue(), ^{ [self callbackMethod]; // method called after above thread has completed running }); }); } 这个例子是否适用于我想要做的事情? […]

我为什么要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可以/不应该使用。 有什么想法吗?

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) […]