0

我正在使用流行的类 SSZipArchive 来解压缩文件,具体来说是这个方法:

+ (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){
         .....
4

1 回答 1

1

你可能不在主线程上,你可以试试这个:

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

编辑

由于您在主线程上,并且您想立即更新标签,因此您需要:

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";       
    });
}

但是,我不明白为什么它在您的示例中的方法结束时没有更新。可能有更好的解决方案。

于 2015-07-24T08:27:34.677 回答