iOS:总是在后台运行单例实例(不同的线程)

时间:2014-04-04 12:17:20

标签: ios objective-c multithreading core-data singleton

我有一个管理整个Core Data写入和读取方法的单例类,有时(由于JSON解析和多个对象节省)这个单例(现在在主线程中运行)阻止了UI。

我使用以下代码创建Singleton实例:

static MyClass *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        sharedInstance = [[MyClass alloc] init];
    });
});
return sharedInstance;

如何在不同的线程中创建此实例,以便在后台完成所有数据库任务?谢谢!

2 个答案:

答案 0 :(得分:1)

您不在另一个线程中创建实例(或者至少您不需要)。这是一个关于在编辑内容时运行方法的线程的问题。因此,它更像是一个核心数据设置问题。

即。如果你在后台线程中创建实例但是从主线程调用它的方法,那么该方法仍将在主线程上运行。

如果为单例创建MOC(因此它不使用主队列MOC)并使用performBlock:在该MOC上运行任何更新,那么它将在与上下文关联的线程上运行而不是主线。


从你的评论中,你需要在每个方法实现的开头验证线程,并在必要时切换到另一个线程(这可以通过在切换线程后调用相同的方法来完成)。

没有自动执行此操作,您需要自己编写代码。

请注意,您的MOC应仅用于1个线程,因此您需要注意如何访问它,强烈建议使用performBlock: ...

答案 1 :(得分:1)

我建议使用Grand Central Dispatch在您喜欢的任何线程上运行单例方法的内容。以dispatch_async为例。