等待的方法或在背景中运行

时间:2013-03-28 09:48:53

标签: ios objective-c xcode

我有一段代码首先调用一个方法,该方法会生成相当多的缩略图,因此它会使设备速度降低大约一秒钟。我希望在调用第一个方法之前运行一个生成“加载消息”的方法,然后在第一个方法完成时将其删除。

[picker dismissViewControllerAnimated:YES completion:^{
    NSLog(@"Loading");
    [self generatingThumbnailMessageShow];
    [self loadAllEffects];

}];

问题似乎是虽然“generateThumbnailMessageShow”方法在“loadAllEffects”方法之前,但在“loadAllEffects”消息完成之后,它似乎仍然被调用。仅在第一个方法完成时调用“loadAllEffects”方法的最佳方法是什么?

1 个答案:

答案 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];
        })
    })

}];