2017-02-20 17 views
0

меня сложную операцию, а затем, когда работают полный,задержка IOS writeToURL или заморозить экран, как решить нить в случае

Это сэкономит NSData запись в файл для просмотра.

я сталкиваюсь с проблемой, когда я нажимаю кнопку,

кнопку Действие начнется шоу MBProgress вещи и асинхры в комплекс работает в фоновом режиме.

Когда файл записывается успешно, он перейдет к методу передачи метода prepareForSegue в destinationViewController.

Я пытаюсь добавить поток, но я обнаружил, что мой экран всегда зависает или не может записать файл успеха, чтобы этот экран отображал предупреждение (я думаю, что он работает не полностью, поэтому BOOL NO).

Как записать решение в этом случае для показа MBProgress, чтобы завершить операцию, а затем перейти к следующему диспетчеру просмотра?

спасибо.

Мой код ниже:

- (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; 

} 
} 

ответ

0

Я не мог понять, если файл был написан или нет. Во всяком случае, имейте в виду, что если вы попытаетесь отправить основной поток, вы всегда должны сначала проверить, находитесь ли вы уже в основном потоке, потому что он может повесить приложение. Пример:

if([NSThread isMainThread]){ 
    //perform gui operation 
} else { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     //perfrom gui operation 
    }); 
} 

Edit: Вы должны рассмотреть возможность использования dispatch_sync вместо dispatch_async для основного потока, так как у вас есть вложенные депеши в - (IBAction) fileBtnAction: (UIButton *) Отправитель:

[self doComplexOperateAction]; 

    dispatch_**sync**(dispatch_get_main_queue(), ^{ 
     fileHud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
     fileHud.label.text = @"file operating...."; 
     fileHud.userInteractionEnabled = NO; 
     }); 
    }); 
+0

Мой код будет что-то работать и сохранять файл. когда файл сохранит успех, он перейдет к следующему uiviewcontroller. Поэтому я хочу подождать, когда файл будет сохранен, а затем код запустит метод подготовки к навигации по методу forforsegue. Но я не знаю, как подождать файл, чтобы сохранить полную навигацию к следующему диспетчеру просмотра. Спасибо . – dickfala

+0

Отредактировал свой ответ. –

+0

Спасибо, ответ. Я пытаюсь использовать dispatch_sync вместо dispatch_asaync для основного потока, но значение «writeFileSuccess» равно NO, а не ждать сохранения файла, а затем перейдите к пункту prepareforsegue. – dickfala

0

Я думаю, что это будет примерно так:

@property (noatomic) BOOL uploading; 
- (IBAction)fileBtnAction:(UIButton *)sender{ 

    fileHud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
    fileHud.label.text = @"file operating...."; 
    fileHud.userInteractionEnabled = NO; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ 
     [self doComplexOperateAction]; 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      [self performSegueWithIdentifier:@"fileSuccessSegue" sender:nil]; 
     }); 
    }); 

} 

- (void) doComplexOperateAction{ 
    self.uploading = YES; 
    ....... do something....... 

    NSError *error; 
    writeFileSuccess = [resultFilie.fileContent writeToURL:previewFileUrl 
                options:NSDataWritingFileProtectionComplete 
                 error:&error]; 

    self.uploading = NO; 
} 

-(BOOL) shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender{ 

    if([identifier isEqualToString:@"fileSuccessSegue"]){   
     if(writeFileSuccess == YES){ 
      fileHud.hidden = YES; 
      fileHud = nil; 
      return YES; 
     }else{ 
      msgAlertController.message = @"can't write file success"; 
      [self presentViewController:msgAlertController animated:YES completion:nil]; 
      fileHud.hidden = YES; 
      fileHud = nil; 
     }); 
     return NO; 
     } 
    } 
    return !self.uploading; 
} 

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 

    if([[segue identifier] isEqualToString:@"fileSuccessSegue"]){ 

     ......... 
     NSURL *fileURL = [NSURL fileURLWithPath:fileTmpPathString]; 
     fileSuccessViewController *pfVC = [segue destinationViewController]; 
     pfVC.filePathURL = fileURL; 

    } 
} 

Я бы посоветовал вам переписать этот код. Мне не нравится, как вы обрабатываете ошибки. Потому что writeFileSuccess имеют непредвиденное значение при загрузке содержимого.

+0

спасибо ответ сначала. Я пытаюсь, чтобы исправленный код отображал предупреждение, не дожидаясь завершения сохранения файла. Мне нужно подождать сохранения файла, а затем передать URL-адрес следующему uiviewcontroller. Благодарю. – dickfala

+0

Может быть, я не понимаю, что вам нужно. Мой код покажет MBProgressHUD при сохранении файла.После сохранения файла он будет выполнять segue, чтобы показать другой viewcontroller. – Sergey

+0

Привет, Сергей, смысл в том, что ты прав. Но я пытаюсь использовать ваш метод, он будет сбой. @@ it show [... fileBtnAction:] _ block_invoke – dickfala