1

我有一个“同步”任务,它依赖于几个“子任务”,其中包括异步网络操作,但都需要访问单个NSManagedObjectContext. 由于NSManagedObjectContexts 的线程要求,我需要这些子任务中的每一个在同一个线程上执行。由于其中一些任务的处理量很大,我需要它们在后台线程上。

目前,我正在通过在我的单例SyncEngine对象的-init方法中执行此操作来启动一个新线程:

[self performSelectorInBackground:@selector(initializeSyncThread) withObject:nil];

-initializeSyncThread方法如下所示:

- (void)initializeSyncThread
{
    self.syncThread = [NSThread currentThread];
    self.managedObjectContext = [(MyAppDelegate *)[UIApplication sharedApplication].delegate createManagedObjectContext];
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    [runLoop run];
}

NSRunLoop这是为这个线程启动的正确方法吗?有更好的方法吗?运行循环只需要处理“performSelector”源,它(及其线程)应该在进程的生命周期内存在。

在设置NSAutoreleasePool.

4

2 回答 2

0

关于NSAutoreleasePool,我只是在后台运行的选择器的开头创建一个。然后在运行循环完成后(并且我的调用完成),我在返回之前像往常一样释放。

于 2010-05-14T10:06:20.970 回答
0

我不是 100% 确定这是解决您的问题的最有效方法,但我正在这样做......

callComplete由于异步网络操作可能需要不同的时间来完成(或超时),我使用实例变量(在本例中称为 BOOL )来跟踪它们

当启动网络请求的代码时,我NSURLConnection已经离开并做这件事很神奇,我等待调用像这样完成。

while(!callComplete && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]){
    // Here you can perform other checks, like making sure the method isn't running forever (with a timeout variable)
    // Just set callComplete to YES when done
}
于 2010-05-14T10:01:27.330 回答