0

在下一个视图控制器被推入之前,块没有完成。在segue之前未完成块

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
if ([[segue identifier] isEqualToString:@"ResultsView"]) 
{ 
    [self.spinner startAnimating]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     NSMutableArray *results = [[NSMutableArray alloc] init]; 
     results = [self generateResults]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      [self.spinner stopAnimating]; 

      ResultViewController *controller = [segue destinationViewController]; 
      controller.results = results; 

     }); 
    }); 
} 
} 

这是generateResults方法:如何延缓或重组以下任何建议

- (NSMutableArray *)generateResults 
{ 
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
__block NSMutableArray *matches = [[NSMutableArray alloc] init]; 

[library enumerateGroupsWithTypes:ALAssetsGroupAll 
         usingBlock:^(ALAssetsGroup *group, BOOL *stop) 
{ 
    if (group) { 
     [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 
     [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop){ 

      if (asset) 
      { 
       //work done here. 
      } 
     }]; 
    } 
} failureBlock:^(NSError *error) { 
}]; 

return matches; 
} 

或者,当我不使用调度同步,那么同样的问题,该块生成结果太晚了。下一个视图控制器已经出现,显示0找到。

+0

变成你的故事板(不能用故事板视图推提供)和替换功能 - (空)prepareForSegue:(UIStoryboardSegue *)赛格瑞发件人:(ID)发送者。通过另一个功能,但做同样的事情,然后该块将工作。 – lee

回答

1

请注意,prepareForSegue只是作为准备。即,一旦完成,segue将执行。因此,如果您需要在继续发生之前准备控制器,则不能将此任务放入异步块中。 就runloop而言,您的prepareForSegue立即完成

如果您的下一个控制器依赖于prepareForSegue内的预备代码,那么您不应该执行dispatch_async。相反,要么在主队列上执行generateResults,要么让ResultViewController调度任务异步,并根据结果更新其自己的视图。

+0

下一个视图控制器需要它。如果我在主队列中执行它,那么在下一个视图控制器初始化之后,块会结束。有没有其他方法? – user3131312

0

解决了它,这是我所做的。没有必要使用派遣。或者,该块在group == nil时完成。所以一个简单的else声明可以做得很好。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
if ([[segue identifier] isEqualToString:@"ResultView"]) 
{ 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    __block NSMutableArray *matches = [[NSMutableArray alloc] init]; 

    [library enumerateGroupsWithTypes:ALAssetsGroupAll 
          usingBlock:^(ALAssetsGroup *group, BOOL *stop) 
    { 
     if (group) { 
      [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 
      [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop){ 

       if (asset) 
       { 

       } 
      }]; 
     } else { 

      ResultsViewController *resultsViewController = [segue destinationViewController]; 
      resultsViewController.results = matches; 
      [resultsViewController.collectionView reloadData]; 
     } 
    } failureBlock:^(NSError *error) { 
    }]; 
} 

}

相关问题