UIImage * hiResImage = [[UIImage alloc] initWithContentsOffile:path];
仅供参考,我稍后在主线程上进行UI更新,就像这样……
[imageVIEwForZoom performSelectorOnMainThread:@selector(setimage:) withObject:hiResImage waitUntilDone:NO];
我所知道的:
>自iOS4以来,UIKit的许多绘图方法变得线程安全.从here开始阅读.
>我不应该在后台线程上更新ui(例如没有[myImageVIEw setimage:image];)
编辑:让我们看看另一种观点. ‘不线程安全’是否意味着它有可能永远被阻止?或者只是意味着在开始/持续时间执行时间上没有保证.如果是后一种情况,那么在加载图像时我们会有一些“未确定的”延迟量是没有问题的. UI更新在主线程上完成.因此,至少创建UIImage仍然可以认为是非线程安全的.
我知道这与问题没有关系,只是想指出来,因为我担心我原来的问题没有明确的答案:)
解决方法 我下面的经验并不直接与UIImage initContentsFromfile:但是使用UIImage imageWithData,但你的问题是关于UIImage线程的安全性.我最近不得不调试使用[UIImage imageWithData:]的问题,该问题是从NSURLConnetionDelegate函数connectionDIDFinishLoading调用的,使用多个后台线程下载图像.由于下载的图像用于更新UI,我不得不使用下面的[NSOperationQueue mainQueue] addOperationWithBlock …
- (voID) connection:(URLConnection*)connection dIDReceiveData:(NSData *) data { [imgData appendData:data];}- (voID) connectionDIDFinishLoading:(NSURLConnection*)connection { [NSOperationQueue mainQueue] addOperationWithBlock:^{ UIImage *img = [UIImage imageWithData:imgData]; // more code here to update the UI }];}
>在iOS 7.x模拟器上运行时,img保存有效图像
>在iOS 7.x设备(iPod touch)上运行时,img始终为零
在调试会话期间,我注意到当调试器一次一行地遍历每个语句时,问题(暂时)消失了.我的理论是在调试器步骤模式下运行不会让UIImage处理运行imageWithData的并发线程.因此,我相信UIImage imageWithData(或许其他类似的函数)不是线程安全的.
使用@synchronized块似乎解决了这个问题
- (voID) connectionDIDFinishLoading:(NSURLConnection*)connection { [NSOperationQueue mainQueue] addOperationWithBlock:^{ @synchronized(imgData) { // Run the following in a synchronized block UIImage *img = [UIImage imageWithData:imgData]; } // more code here .... }];}总结
以上是内存溢出为你收集整理的ios – 创建UIImage线程安全吗?全部内容,希望文章能够帮你解决ios – 创建UIImage线程安全吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)