2009-10-06 121 views
1

我正在編寫一個程序,向我的AudioSession和AudioQueues生成的類似控制檯的UITextView顯示不同的事件。例如,當我檢測到我的音頻路由發生了變化時,我只想在我的iPhone的屏幕上顯示一條快速消息,告訴您發生了這種情況。不幸的是,我相信我正在陷入一些競爭條件的混亂,我不確定解決這個問題的最佳解決方案是什麼。圖形用戶界面更新同步問題

當我運行我的程序,我調試控制檯吐出了這一點:

布爾_WebTryThreadLock(布爾),0x1349a0:嘗試以獲得比主線程或web線程以外的線程網絡鎖定。這可能是從輔助線程調用UIKit的結果。現在崩潰...

這發生在一行代碼:

textView.text = string; 

我嘗試這樣做:

[textView performSelectorOnMainThread:@selector(setText:) withObject:string waitForDone:YES]; 

而這似乎已經固定,但我敢肯定我不應該做這樣的事情來實現它。不幸的是,這不適用於[UITextView scrollVisibleWithRange:],因爲這需要一個NSRange,它不是NSObject的後代。我認爲我所做的是根本錯誤的。

這段代碼是從一箇中斷監聽器中調用的,它從音頻隊列的線程中運行。有什麼我應該做的,這將使我的更新到我的textview阻止,所以我沒有得到這個問題?

謝謝。

回答

2
  1. 您被允許爲查看做任何事情只從主線程,你做了正確的事情。
  2. 如果它需要更多的參數或原語,您可能需要代理功能。

這是我如何做一個代理功能

// the caller should be like this 
UTMainThreadOperationTextViewScroll *opr = [[UTMainThreadOperationTextViewScroll alloc] init]; 
opr.textView = textView; 
opr.range = NSMakeRange(5, 10); 
[UTMainThread performOperationInMainThread:opr]; 
[opr release]; 

// the Utility classes goes below 
@interface UTMainThreadOperation : NSObject 
- (void)executeOperation; 
@end 

@implementation UTMainThread 

+ (void)performOperationInMainThread:(UTMainThreadOperation *)operaion 
{ 
    [operaion performSelectorOnMainThread:@selector(executeOperation) withObject:nil waitUntilDone:NO]; 
} 

@end 

@implementation UTMainThreadOperationTextViewScroll 

@synthesize textView; 
@synthesize range; 

- (void)dealloc { /* I'm too lazy to post it here */ } 

- (void)executeOperation 
{ 
    [textView scrollVisibleWithRange:range]; 
} 

@end 

PS。一些省略的聲明