確定進行状況バーを使用して長い計算を完了しようとしています。これは、以下のコードで正常に機能しています。ただし、 を呼び出すメソッドでは、オブジェクトの更新が完了する前scan
にすぐに移動します。ディスパッチ キューが終了するのを待つためのさまざまな方法をすべて試しましたが、いずれも UI がハングしてしまいます。コールバックを使用する必要がありますか? このソリューションを調べましたが、すべての引数を渡し、変数を前後に返す方法がわかりません。 scoreWithEquation
scan
StoredLibrary
-(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