ios – 即使在后台线程上,也可以将UIImage写入文件锁定UI

我正在使用以下代码保存一些图像,我正在后台线程上执行此操作:

dispatch_async(dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_BACKGROUND,0),^ {
    [NSKeyedArchiver archiveRootObject:array_of_objects_implementing_NSCoding toFile:myFile];
});

我有在数组中实现NSCoding协议的对象,并且每个对象都有一个数组,其中包含与之关联的图像.每当我调用它时,当图像足够大时(从照片库中取出的东西),UI就会冻结.这是保存图像的代码

- (void)encodeWithCoder:(NSCoder *)encoder {
    NSLog(@"Beginning encoding.");
    NSData* imageData = UIImagePNGRepresentation(self.image);
    [encoder encodeObject:imageData forKey@"image"];
    NSLog(@"Encoding completed.");
}

我通过执行得到了应用程序cpu使用情况的概况,当用户界面处于冻结状态时,cpu使用率达到100%,其中85%使用“UIImagePNGRepresentation”指向该行.此外,当调用它时,“开始编码”.打印到控制台,但“编码完成”.永远不会.

为什么这会锁定UI,即使它是在后台线程上?

解决方法

您不应该从后台线程使用UIImagePNGRepresentation. Apple已经使一些UIKit线程安全但不是全部.请尝试使用CGImage或ImageIO调用.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...