【问题标题】:Dispatch_async and UIDispatch_async 和 UI
【发布时间】:2011-08-25 06:58:58
【问题描述】:

我发出警报通知用户保存操作,我将其添加到视图中,保存一些图像并关闭警报。但是,它并没有按照我希望的方式工作。首先在控制台中查看ofc下面的代码,我得到“已保存..”然后是“dispath”。我想获得相反的效果,首先获得“dispath”然后“保存..”(所以在屏幕上写警报,然后保存在后台,最后解除警报)。但是我更改了 imageView1 的图像,所以我不能将合并移出 dispath_async,因为它是一个 UI 操作.. 那该怎么做..?我需要先合并图像,然后再合并图像以保存它们以及所有这些计算时间以保持警惕。

//adding alert to view
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
^{
    dispatch_async(dispatch_get_main_queue(), ^{
        //i want this to complete->
        imageView1.image = [self merge:imageView1.image and:imageView2.image];
        NSLog(@"dispatch");
    });

    //and then to do this action->
    UIImageWriteToSavedPhotosAlbum(imageView1.image, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), nil);
    NSLog(@"saved..");

    dispatch_async(dispatch_get_main_queue(), ^{
        [alert dismissWithClickedButtonIndex:0 animated:YES];
    });
});

【问题讨论】:

    标签: iphone objective-c dispatch


    【解决方案1】:

    您应该简单地使用dispatch_sync 而不是dispatch_async。在主线程上执行完块之前,该函数不会返回。

    【讨论】:

    • 我忘了补充说我有 actionSheet,我点击按钮调用上述方法。当我使用 dispatch_sync 时,actionSheet 没有隐藏,因此用户可以看到我的警报(在这种情况下出现在 actionSheet 菜单下)。
    • 对不起,我应该更清楚。您仍然应该使用dispatch_async(dispatch_get_global_queue...,但在其中使用dispatch_sync(dispatch_get_main_queue...
    • 这是个不错的选择!谢谢^^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    相关资源
    最近更新 更多