2011-06-01 91 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

相關問題