我有一段代码首先调用一个方法,该方法会生成相当多的缩略图,因此它会使设备速度降低大约一秒钟。我希望在调用第一个方法之前运行一个生成“加载消息”的方法,然后在第一个方法完成时将其删除。
[picker dismissViewControllerAnimated:YES completion:^{
NSLog(@"Loading");
[self generatingThumbnailMessageShow];
[self loadAllEffects];
}];
问题似乎是虽然“generateThumbnailMessageShow”方法在“loadAllEffects”方法之前,但在“loadAllEffects”消息完成之后,它似乎仍然被调用。仅在第一个方法完成时调用“loadAllEffects”方法的最佳方法是什么?
答案 0 :(得分:3)
问题是[self loadAllEffects]
在主线程上运行并阻止了UI。只有在程序控制返回主runloop后,才能看到对UI的更改。
您必须将[self generatingThumbnailMessageShow];
的执行移至后台线程,例如
[picker dismissViewControllerAnimated:YES completion:^{
NSLog(@"Loading");
// Show "loading" message (must be done on main thread)
[self generatingThumbnailMessageShow];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// perform long running task on background thread
[self loadAllEffects];
dispatch_sync(dispatch_get_main_queue(), ^{
// Hide "loading" message (must be done on main thread again).
[self generatingThumbnailMessageHide];
})
})
}];