我需要以下想法 -
在某个执行点的主线程中说点A(顺序逻辑),我需要记住执行状态并将其他逻辑的执行委托给另一个线程,并让主线程处理UI事件等当委托逻辑在另一个线程上完成时,执行流应该从A点继续,并且应该重新收集整个执行上下文并继续进行,就好像它从未在那里暂停一样。
此致 Sunil Phani Manne
答案 0 :(得分:1)
很难按照你说的方式实现这一点(例如do(things)... yield(other_thread); ...do(more_things);
。
以下是我能想到的其他几个选项(您必须自己实现这些选项,例如使用代理或通知;我只是给出了它如何工作的基本概述):
do(things)
[object doStuffOnOtherThreadWithCallback:^{ // block-based
do(more_things)...
}];
...或
do(things)
[object doStuffOnOtherThreadWithCallbackTarget:self // target/selector-based
selector:@selector(callbackSelector)];
}
- (void)callbackSelector {
do(more_things)...
}
答案 1 :(得分:1)
您拥有的一个选项是封装代理中A点之后的整个顺序逻辑,然后在辅助线程结束时在主线程上执行它。
换句话说,当您通过调用启动线程时,例如
[NSThread detachNewThreadSelector:sel toTarget:target withObject:delegate]
您可以实现目标target
,以便它具有在主线程completion
末尾调用的特定选择器sel
,就像这样(这是您的{ {1}}类):
delegate
当然,这里有很多子选项,比如使用不同的调用来启动后台执行等等。
重要的一点是:你必须在一个选择器中封装在A点之后的所有逻辑,并且你必须在主线程上安排执行这个选择器,以便回到你的上下文(虽然你的上下文会在此期间发生变化,因为你也会更新UI。
编辑:
必须在主线程上安排执行会使块不适合这种回调。另一方面,块具有以下优点:它们在某种有限的意义上允许您访问定义块的相同词汇上下文(这大致就是您所谓的上下文)。
对此的解决方法可能如下。在分离新线程之前,在委托中存储要在完成时执行的块:
@implementation YOURDelegateClass {
.....
-(void)completion {
}
-(void)sel {
...
...
[self performSelectorOnMainThread:@selector(@"completion") withObject:self];
}
}
当然,您只能通过块获得保证的上下文保留。但是在这里你遇到了语言的限制。
如果您需要更多上下文保留,那么唯一的可能性就是将该上下文封装在您的委托类ivars中。
答案 2 :(得分:1)
有一件事是肯定的。最有可能的是,Cocoa中的任何直接特征都没有。既然你说你不能将资源复制到新线程上(出于一个很好的理由),我建议你使用NSUndoManager
。对于您在线程中进行的每个更改,将该更改的撤消操作推送到撤消管理器。在线程结束时,执行撤消管理器对象中的所有撤消操作。如果正确完成,这应该恢复您的状态。现在,由于这个想法未经测试,因此可能无法撤消所有操作。你必须先检查出来。