我有一個複雜的操作,那麼當操作完成後,的iOS writeToURL延遲或畫面凍結,如何解決線程的情況下
這將節省的NSData寫入文件預覽。
我遇到一個問題,當我按一下按鈕,
按鈕動作開始表演MBProgress的事情,異步到複雜的背景中運行。
當文件寫入成功時,它會將prepareForSegue方法的傳遞值傳遞給destinationViewController。
我嘗試添加線程,但我發現我的屏幕始終凍結或無法寫入文件成功停留此屏幕顯示警報(我認爲它操作不完整,因此獲得BOOL爲NO)。
如何在這種情況下編寫解決方案以顯示MBProgress等待操作完成,然後導航到下一個viewcontroller?
非常感謝。
我下面的代碼:
- (IBAction)fileBtnAction:(UIButton *)sender{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
[self doComplexOperateAction];
dispatch_async(dispatch_get_main_queue(), ^{
fileHud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
fileHud.label.text = @"file operating....";
fileHud.userInteractionEnabled = NO;
});
});
}
- (void) doComplexOperateAction{
....... do something.......
NSError *error;
writeFileSuccess = [resultFilie.fileContent writeToURL:previewFileUrl
options:NSDataWritingFileProtectionComplete
error:&error];
}
-(BOOL) shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender{
if([identifier isEqualToString:@"fileSuccessSegue"]){
if(writeFileSuccess == YES){
fileHud.hidden = YES;
fileHud = nil;
return YES;
}else{
dispatch_async(dispatch_get_main_queue(), ^{
msgAlertController.message = @"can't write file success";
[self presentViewController:msgAlertController animated:YES completion:nil];
fileHud.hidden = YES;
fileHud = nil;
});
return NO;
}
}
return NO;
}
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([[segue identifier] isEqualToString:@"fileSuccessSegue"]){
.........
NSURL *fileURL = [NSURL fileURLWithPath:fileTmpPathString];
fileSuccessViewController *pfVC = [segue destinationViewController];
pfVC.filePathURL = fileURL;
}
}
我的代碼會做一些操作並保存文件。當文件保存成功時,它將導航到下一個uiviewcontroller。所以我想等待文件保存完成,然後代碼將運行prepareforsegue方法導航下一個控制器。但我不知道如何等待文件保存完整的導航到下一個viewcontroller。謝謝 。 – dickfala
編輯我的答案。 –
感謝您的回覆。我嘗試使用dispatch_sync代替主線程的dispatch_asaync,但「writeFileSuccess」值爲NO,不等待保存文件完成,然後轉到prepareforsegue。 – dickfala