長いメインスレッド アクションの進行状況を表示するのに少し問題があります (メイン スレッドにある必要があります)。
アクションは、ボタンを押すことによって呼び出されます。
-(void)getCSVExport:(id)sender{
...
NSString *filePath = [path stringByAppendingPathComponent:fileName];
NSData *csvData = [NSData dataWithContentsOfFile:filePath];
if (nil == csvData) {
_progressView.hidden = NO;
[self.view bringSubviewToFront:_progressView];
_progressView.progress = 0;
csvData = [self generateCSVExportForMonth:_monthToExportInt];
[csvData writeToFile:filePath atomically:YES];
_progressView.hidden = YES;
}
...
}
関数内でgenerateCSVExportForMonth:
、進行状況を で更新してい_progressView.progress = newValue
ます。
私は今2つの問題があります:
1) 呼び出しボタンを押すとgetCSVExport:
、呼び出しが終了するまでボタンが強調表示されたままになります。2)progressViewは表示されず、それ自体を更新することは言うまでもありません。
情報: デバイスによっては、通話に 0.5 ~ 2 秒かかります。
私が間違っていたアイデアはありますか?
// 編集: backgroundThread を使用した新しいバージョン:
[self.view bringSubviewToFront:_progressView];
_progressView.progress = 0;
[self performSelector:@selector(assignCSVData:) onThread:[NSThread new] withObject:csvData waitUntilDone:YES];
_progressView.hidden = YES;
時間のかかる呼び出し:
-(void)assignCSVData:(NSData*)data{
data = [self generateCSVExportForMonth:_monthToExportInt];
}
これにより、performSelector
呼び出し時にデッドロックが発生します。