iOS:dispatch_async和UIImageWriteToSavedPhotosAlbum

Mrw*_*lfy 4 asynchronous save uiimage grand-central-dispatch ios

只是学习如何在线程之间分配任务,或者异步调度.我知道任何"触及"视图的操作都必须在主线程上完成.怎么样UIImageWriteToSavedPhotosAlbum我认为这可以在后台线程上完成,但我错了吗?

此外,如果它应该在后台线程上完成,下面这两个调用之间是否有区别,因为一个保存UIImage而另一个从视图中保存UIImage?

UIImageWriteToSavedPhotosAlbum(_someUIImage ,nil,nil,nil);

UIImageWriteToSavedPhotosAlbum(_imageView.image ,nil,nil,nil);
Run Code Online (Sandbox Code Playgroud)

顺便说一下,我使用这个设置在主线程中运行HUD,在后台运行任务,这是我的意图.

[HUD_code showMessage:@"saving image"];
dispatch_queue_t concurrentQueue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(concurrentQueue, ^{
        UIImageWriteToSavedPhotosAlbum(someUIImage ,nil,nil,nil);
            dispatch_async(dispatch_get_main_queue(), ^{
                [HUD_code dismiss];
         });
});
Run Code Online (Sandbox Code Playgroud)

rob*_*off 5

UIKit类被记录为仅可从主线程使用,除非另有说明.(例如,UIFont记录为线程安全的.)

关于UIKit 函数的线程安全(与类不同)没有明确的一揽子声明,因此假设它们通常是线程安全的并不安全.某些UIKit函数UIGraphicsBeginImageContext被明确记录为线程安全的事实意味着UIKit函数通常不是线程安全的.

既然UIImageWriteToSavedPhotosAlbum可以发送异步完成消息,你应该在主线程上调用它并使用它的完成支持来执行你的[HUD_code dismiss].