2015-07-24 5 views
0

Я использую популярный класс каллу SSZipArchive разархивировать файл, конкретно этот метод:UILabel перезарядка текст

+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler 

И я обновляю два uilabels текст в блоках внутри, оба из них выделяются, оба их текста меняются раньше, когда я печатаю содержимое uilabels, текст обновляется, но экран не обновляет его, я должен сказать, что этот метод загружается, когда я заканчиваю загрузку zip в метод делегата ,

Мой код:

- (void)downloadManager:(id)sender finishedDownload:(ANDownload *)download { 
    if ([[NSFileManager defaultManager] fileExistsAtPath:download.storeFile]) { 
     NSLog(@"Download exists"); 
     [self.labelStep setText:CustomLocalizedString(@"ZIP_DECOMPRESSING_MSG", nil)]; 

     [SSZipArchive unzipFileAtPath:download.storeFile toDestination:self.saveFolderPath progressHandler:^(NSString *entry, unz_file_info zipInfo, long entryNumber, long total) { 
      //Your main thread code goes in here 
      NSString * labelProgressText = [NSString stringWithFormat:@"%ld/%ld", entryNumber, total]; 
      self.labelProgress.text = labelProgressText; 
     } completionHandler:^(NSString *path, BOOL succeeded, NSError *error) { 
     NSLog(@"Succeeded %d in path: %@", succeeded, path); 
     if(succeeded){ 
     ..... 
+0

Показать свой код, а не 'unzipFileAtPath: ...' подпись метода. Как ты это используешь? Отправьте как можно больше связанного кода ... – robertvojta

+0

Вы обновляете метку в 'if (success) {...}'? – sbarow

+0

Нет, в этом я делаю некоторые вещи и представляю еще один контроллер представления ... Я обновляю текст labelStep и labelProgress, где вы можете его увидеть ... – peig

ответ

1

Вы, вероятно, не в главном потоке, вы можете попробовать это:

dispatch_async(dispatch_get_main_queue(), ^{ 
    //Your main thread code goes in here 
    yourLabel.text = @"new text";  
}); 

EDIT

Поскольку вы в основном потоке, и вы хотите немедленно обновить свои ярлыки, вам понадобится следующее:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     //Your main thread code goes in here 
     yourLabel.text = @"new text";  
    }); 
} 

Однако я не понимаю, почему он не обновляется в конце вашего метода в вашем примере. Возможно, будет лучшее решение.

+0

Хорошо, вы правы, я, вероятно, не в основной теме, но если я использую свой путь, он обновляет текст только тогда, когда метод заканчивается, и это не то, что я ищу ... – peig

+0

Хм, это странно, это поведение говорит о том, что вы на самом деле в основном потоке, можете ли вы проверить, что '[NSThread isMainThread];' возвращается? – streem

+0

Да, я в главной теме ... это странно ... – peig