主线程的执行上下文

时间:2011-06-01 06:15:31

标签: iphone

我需要以下想法 -

在某个执行点的主线程中说点A(顺序逻辑),我需要记住执行状态并将其他逻辑的执行委托给另一个线程,并让主线程处理UI事件等当委托逻辑在另一个线程上完成时,执行流应该从A点继续,并且应该重新收集整个执行上下文并继续进行,就好像它从未在那里暂停一样。

此致 Sunil Phani Manne

3 个答案:

答案 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。对于您在线程中进行的每个更改,将该更改的撤消操作推送到撤消管理器。在线程结束时,执行撤消管理器对象中的所有撤消操作。如果正确完成,这应该恢复您的状态。现在,由于这个想法未经测试,因此可能无法撤消所有操作。你必须先检查出来。

相关问题