我正在嘗試使用確定的進度條完成長時間計算。這與以下代碼正常工作。但是,在調用scan
的方法中,在scan
已完成更新StoredLibrary
對象之前,立即轉到scoreWithEquation
。我已經嘗試了所有不同的方法來等待調度隊列完成,但他們最終都掛起了用戶界面。我需要使用回撥嗎?我已經研究過這個解決方案,但我不明白如何傳遞所有參數並來回返回變量。被調用方法中的異步調度
-(void) scan{
if (!_sheet){
[NSBundle loadNibNamed: @"ProgressSheet" owner: self];
}
[NSApp beginSheet: _sheet
modalForWindow: [[NSApp delegate]window]
modalDelegate: self
didEndSelector: NULL
contextInfo: nil];
[_sheet makeKeyAndOrderFront:self];
[_progressBar setIndeterminate:YES];
[_progressBar setMinValue:0];
[_progressBar startAnimation:self];
__block NSMutableArray *tempTracks = [[NSMutableArray alloc]init];
//do stuff
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//do stuff
[_progressBar setDoubleValue:0.f];
[_progressBar setMaxValue:[listTracks count]];
[_progressBar setIndeterminate:NO];
for (iTunesTrack *listTrack in listTracks) {
//do stuff to tempTracks
}
dispatch_async(dispatch_get_main_queue(), ^{
[_progressBar incrementBy:1];
});
}
}
dispatch_async(dispatch_get_main_queue(), ^{
[_progressBar setIndeterminate:YES];
[NSApp endSheet:self.sheet];
[self.sheet orderOut:self];
self.listTracks = tempTracks;
});
});
}
下面是調用scan
代碼:
- (IBAction)evaluate:(id)sender {
if (self.storedLibrary == nil){
self.storedLibrary = [[StoredLibrary alloc] init];
[self.storedLibrary scan];
}
self.tableTracks = [self.storedLibrary scoreWithequation:[_scoringEquation stringValue]
sortOrder:[_sortOrder titleOfSelectedItem]
trackLimit:[_trackLimit integerValue]];
}
我想保持scan
和scoreWithEquation
作爲單獨的方法,因爲他們在別處單獨調用。
我實際上已經嘗試過這種方式,但它不起作用。 'scan'正在更新的實例變量('listTracks')在調用'scoreWithEquation'時似乎沒有更新。我在想這也許是因爲在更新實例變量之前發送了調度。在你執行掃描的代碼scoreWithEquation之前調用「//執行到tempTracks的東西」時會調用 – abroekhof 2013-05-04 22:15:13
。如果您調度到一個串行隊列,它們將在系列中執行。你必須調度異步scoreWithequation到「掃描」相同的串行隊列 – Ultrakorne 2013-05-04 22:24:11
我只是試了一遍,找出了什麼問題。移動'self.listTracks = tempTracks;''dispatch_async(dispatch_get_main_queue()')塊外部似乎是個問題,如果它在裏面,它會在'scoreWithEquation'被調用後更新。 – abroekhof 2013-05-04 22:42:45