我顯示一個較長的主線程動作的進度(需要在主線程中)有點麻煩。UIButton狀態和選擇器的進度
通過按下按鈕調用該操作。
-(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;
}
...
}
中的Funktion 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
呼叫的僵局。
我的問題是生成csv文件的方法訪問coredata。因爲過去曾發生過僵局,並希望避免這種僵局。讓用戶在應用程序的整個生命週期中等待最多2秒 - 報告將永遠不會重新創建,但存儲和重用 - 是我確保穩定性的計劃。另一種方式是,我需要確保應用程序停留在同一個地方(viewcontroller),直到生成報告爲止,因爲它將在那裏使用:/如果有一個聰明的做法,我會很高興以及:) –
它是否總是依靠Cora數據對象?難道你不能只抓取你需要的對象,並把它們傳給後臺的解析器? – DrummerB
報告需要5+(numberOfDaysOfMonth)提取,並不斷傳播函數執行。對象和屬性提取之間的提取差異很大。由於對結果進行繁瑣的排序,一次性提取所有內容會造成巨大的性能損失。 –