2011-06-01 96 views
0

我需要的想法如下 -主线程的执行上下文

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

的问候,苏尼尔 曼尼Phani

回答

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)... 
} 
+0

即使这里的状态/上下文是问题...... :( – 2011-06-01 06:52:07

+0

如果你使用我的第一个解决方案(块,'^ {}'),状态(局部变量等)将在块内部可访问 – jtbandes 2011-06-01 06:54:50

+0

是的,在得到一个解决方案时必须深入思考这个问题,但是我不得不放弃对3.x设备的支持.. – 2011-06-01 12:30:59

1

您拥有的一个选项是封装委托中的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]; 
} 

当然,你只能得到由块保证你的背景下保存。但是在这里你遇到了语言的限制。

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

+0

这里的问题是状态和上下文,我失去了上下文,它是一个很难记住整个背景,并在第二部分传递它,只是想到有如点A这么多的点。 – 2011-06-01 06:49:56

+0

Plese,请参阅我的编辑... – sergio 2011-06-01 07:05:09

1

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

+0

这是个好主意,但可能不适用于我的情况尽管,谢谢! – 2011-06-01 11:58:00

相关问题