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的线程要求,我需要在同一线程上执行这些子任务中的每一个。由于这些任务中有大量的处理工作要做,所以我需要将它们放在后台线程上
目前,我正在使用singletonSyncEngine
对象的-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如何为主线程进行设置),那么肯定会更可取。我认为您可以使用运行循环观察程序来了解它何时处理完事件。有关更多信息,请查看苹果文档。