我的程序「ThreadsNQueues」 - 見下文 - 在後臺線程中同時使用「A」和「B」填充文本行。當一個文本行被填充10個字符時,它會被附加到一個輸出文本緩衝區(這是一個NSMutableString),並且這個緩衝區應該被寫入UITextView(self.outView
)。如何從線程更新UI
問題:行self.outView.text=_output;
永遠蜂執行:-(對不起,我完全新的多線程在iOS(模擬器上的iOS 9.2測試)...
所以我的問題是:什麼是不對的代碼,我怎麼可以做的更好(GCD是必需的)
#import "ViewController.h"
@interface ViewController()
@end
@implementation ViewController
NSMutableString *_output;
NSMutableString *_line;
NSLock* _lineLock;
dispatch_queue_t _myQueue;
- (void)viewDidLoad {
[super viewDidLoad];
_output=[NSMutableString string];
_lineLock=[[NSLock alloc] init];
_line=[NSMutableString string];
_myQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_async(dispatch_get_main_queue(), ^{
do {
dispatch_async(_myQueue, ^{
if([_lineLock tryLock]) {
[self append:'A'];
[_lineLock unlock];
}
});
dispatch_async(_myQueue, ^{
if([_lineLock tryLock]) {
[self append:'B'];
[_lineLock unlock];
}
});
} while (true);
});
}
- (void)append:(char)c {
[_line appendFormat:@"%c",c];
if (_line.length==10) {
// line is complete
[_line appendString:@"\n"];
[_output appendString:_line];
NSLog(@"%@",_line);
[_line setString:@""];
dispatch_async(dispatch_get_main_queue(), ^{
// update ui (never called !!!)
self.outView.text=_output;
});
}
}
@end
在Xcode控制檯日誌看起來不錯:?
2016-02-14 09:09:38.607 ThreadsNQueues[2807:62067] BAABAAAAAB
2016-02-14 09:09:38.611 ThreadsNQueues[2807:62067] BBAAAABAAA
2016-02-14 09:09:38.614 ThreadsNQueues[2807:62047] BABBAAABBA
2016-02-14 09:09:38.617 ThreadsNQueues[2807:62044] BBAAABAAAB
2016-02-14 09:09:38.619 ThreadsNQueues[2807:62067] BABBAABBAB
2016-02-14 09:09:38.622 ThreadsNQueues[2807:62047] ABABABABAB
2016-02-14 09:09:38.623 ThreadsNQueues[2807:62047] BBABBBABAA
2016-02-14 09:09:38.624 ThreadsNQueues[2807:62047] BBBBBBABBA
2016-02-14 09:09:38.627 ThreadsNQueues[2807:62047] AABAABAABA
...
非常感謝
你在該行上放置了一個斷點?視圖引用是否爲零? – Wain
@ Wain:是的,我把一個bp,它永遠不會到達。不,這個參考很好。 –