繁体   English   中英

主线程的执行上下文

[英]Main thread's execution context

我需要以下方面的想法 -

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

问候, Sunil Phani Manne

很难按照您所说的方式实现这一点(例如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)...
}

您拥有的一种选择是将 A 点之后的整个顺序逻辑封装在您的委托中,然后在辅助线程结束时在主线程上执行它。

换句话说,当您通过调用启动线程时,例如

[NSThread detachNewThreadSelector:sel toTarget:target withObject:delegate]

您可以实现您的目标target ,使其具有特定的选择器completion ,该选择器完成在主线程上的sel结束时调用,如下所示(这是您的delegate类):

@implementation YOURDelegateClass {
   .....
   -(void)completion {

   }

   -(void)sel {
     ...
     ...
     [self performSelectorOnMainThread:@selector(@"completion") withObject:self];
   }
}

当然,这里有许多可用的子选项,例如使用不同的调用来启动后台执行等。

重要的一点是:您必须将 A 点之后的所有逻辑封装在选择器中,并且您必须在主线程上安排此选择器的执行,以便返回您的上下文(尽管您的上下文同时会发生变化,因为您还将更新 UI)。

编辑:

必须在主线程上安排执行会使块不适合这种回调。 另一方面,块的优势在于它们在某种有限的意义上让您可以访问与定义块相同的词法上下文(大致就是您所说的上下文)。

解决方法可能如下。 在分离新线程之前,将您希望在完成时执行的块存储在委托中:

typedef void(^CustomBlock)(void);
@property (nonatomic, copy) CustomBlock customBlock;
....
int a = ...
delegate.customBlock = ^{
   NSLog(@"hello %d.....", a);
}
[NSThread detachNewThreadSelector:sel...
....
-(void)completion {
    [self customBlock];
}

当然,您只能获得按块向您保证的上下文保留。 但是在这里你遇到了语言的限制。

如果您需要更多的上下文保存,那么唯一的可能性就是将该上下文封装在您的委托 class ivars 中。

有一件事情是肯定的。 最有可能的是,Cocoa 中没有任何直接功能可以做到这一点。 既然你说你不能将资源复制到新线程上(有一个很好的理由),我建议你使用NSUndoManager 对于您在线程中所做的每一项更改,将该更改的撤消操作推送到撤消管理器。 在线程结束时,执行撤消管理器 object 中的所有撤消操作。 如果操作正确,这应该可以恢复您的 state。 现在,由于该想法未经测试,因此可能并非所有操作都可以撤消。 你必须先检查一下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM