对于在start方法中调用NSRunloop的NSOperation子类,如下所示:
NSRunLoop * runloop = [NSRunLoop currentRunLoop];
while (!stopRunloop && [runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
将nsoperation添加到NSOperationQueue [而不是主队列]。我需要 runloop以便从执行某些后台的库中获取回调 任务。我的问题如下: 1.准备NSOperation的线程是否复制其所有数据 到NSOperation运行的线程[当开始方法执行开始时]? 2.为什么尽管 stopRunloop ,上述while循环无法终止,但是从库回调中更新了值 YES ? 3. start方法是否还需要@autoreleasepool用法?
由于
答案 0 :(得分:0)
创建线程时,它没有与之关联的运行循环 - 由您来管理。 runloop必须至少有一个与之关联的输入源。
如果在操作(例如网络)中有runloop依赖代码,则当runloop没有连接输入源时,操作可以快速完成或退出。管理此操作的一种方法是在操作中附加输入源(例如NSPort),并在操作完成后将其删除"。最简洁的方法是使用KVO将源管理与NSOperation的状态集成(即当isReady或isExecuting转到YES时附加端口,当isCancelled或isFinished设置为YES时将其删除)。
答案 1 :(得分:0)
您可以使用Core Foundation API停止运行循环:
CFRunLoopStop(CFRunLoopGetCurrent());
参见"退出运行循环"在Run Loop Management。