0

如何判断一个方法是否异步运行?

我有几个与核心数据相关的方法,它们有时通过异步调度队列 (GCD) 异步调用,而其他时候则同步调用。

// sometimes this happens
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
  [[DataServices sharedInstance] doSomeCoreDataStuff:^(BOOL result, NSString *message) 
  {
      // do some post-stuff here        
  }];
});

// other times this happens
[[DataServices sharedInstance] doSomeCoreDataStuff:^(BOOL result, NSString *message) 
{
    // do some post-stuff here        
}];

除此之外,我在NSManagedObjectContext整个应用程序中都使用了单例。由于上下文不是线程安全的,在核心数据方法异步运行的情况下,我需要在这些方法中创建一个新的上下文,否则我想使用单例实例上下文。

想到的唯一方法是类似的[[NSThread mainThread] isMainThread],但 GCD 可能会或可能不会在主线程上工作,所以这不起作用。

4

1 回答 1

3

处理此问题的正确方法是将托管对象上下文配置为使用线程限制并发类型之一-NSPrivateQueueConcurrencyTypeNSMainQueueConcurrencyType- 然后performBlock:在您想要使用它时使用它的方法。那是,

[[DataServices sharedInstance] performBlock:^{
    // do Core Data stuff here
}];

您可以在任何线程或队列上执行此操作,并且它是异步的。还有performBlockAndWait:,如果您需要立即获得结果。

你会在任何地方使用那个调用。唯一的例外是,如果您使用NSMainQueueConcurrencyType并且您知道您正在主队列上运行,您可以直接在上下文上进行调用,而不是通过performBlock:

于 2013-03-01T17:53:48.650 回答