Iphone 如何启动nsrunlop,并确保其具有清空的NSAutoreleasePool?

Iphone 如何启动nsrunlop,并确保其具有清空的NSAutoreleasePool?,iphone,cocoa-touch,multithreading,nsautoreleasepool,nsrunloop,Iphone,Cocoa Touch,Multithreading,Nsautoreleasepool,Nsrunloop,我有一个“同步”任务,它依赖于几个“子任务”,其中包括异步网络操作,但都需要访问单个NSManagedObjectContext。由于NSManagedObjectContexts的线程要求,我需要在同一线程上执行这些子任务中的每一个。由于这些任务中有大量的处理工作要做,所以我需要将它们放在后台线程上 目前,我正在使用singletonSyncEngine对象的-init方法启动一个新线程: [self performSelectorInBackground:@selector(initiali

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

目前,我正在使用singleton
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];
}
这是为此线程启动
nsrunlop
的正确方法吗?有更好的方法吗?运行循环只需要处理“performSelector”源,它(及其线程)应该在进程的生命周期内一直存在


在设置自动释放池时,我是否应该使用运行循环观察程序来创建自动释放池,并在每次运行后将其排空?

我不是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
}

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

我有7-8个方法(最终可能会有更多)需要后台线程上的自动释放池。如果有一种方法可以设置它并将其从运行循环本身中排出(比如CocoaTouch如何为主线程进行设置),那么肯定会更可取。我认为您可以使用运行循环观察程序来了解它何时处理完事件。有关更多信息,请查看苹果文档。