显示图像时出错

Posted

技术标签:

【中文标题】显示图像时出错【英文标题】:Error while displaying an Image 【发布时间】:2012-01-15 16:09:08 【问题描述】:

我收到以下错误,我不知道如何避免它,请有人帮助我

bool _WebTryThreadLock(bool), 0x1ea990: 试图从主线程或web线程以外的线程获取web lock。这可能是从辅助线程调用 UIKit 的结果。现在崩溃了……

 - (void)loadImg 
        NSData* image = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://images.sugarscape.com/userfiles/image/DECEMBER2010/Lozza/HarryStyles2.jpg"]];
        UIImage* img = [[UIImage alloc] initWithData:image] ;
        [self performSelectorInBackground:@selector(showImg:) withObject:img];
    

【问题讨论】:

【参考方案1】:

不要从主线程以外的线程调用任何 UIKit 方法。 performSelectorInBackground:withObject: 在辅助线程上执行 showImg:,如果你在那里调用任何 UIKit 方法,那可能就是问题所在。

其实是用通俗的英文解释的:

这可能是从辅助线程调用 UIKit 的结果

【讨论】:

@sharon 如果在主线程上执行loadImg,只需将最后一行替换为[self showImg: img];即可。 您的意思是删除 ` [self performSelectorInBackground:@selector(showImg:) withObject:img];` 并用 [self showImg: img]; 替换它? 是的。您是否已经探索过 ios 编程的绝对基础知识?这是一个基本的方法调用。【参考方案2】:

从后台线程更新 UI 是不安全的,我假设你在这里这样做

[self performSelectorInBackground:@selector(showImg:) withObject:img];

我想你可能想错了:

    在后台线程中检索图像 在主线程中使用此图像更新 UI

【讨论】:

如何以编程方式完成?【参考方案3】:

根据Threading Programmin Guide: Thread Safety Summary,您应该在主线程上调用 UIView 的操作。尝试 [self performSelectorOnMainThread:@selector(showImg:) withObject:img waitUntilDone:YES]。

【讨论】:

我在使用performSelectorOnMainThread时遇到同样的错误 嗨 Sharon,我认为最好使用 Debug 方案运行以查找应用程序崩溃的哪一行。然后你可以检查它在哪个线程上运行。

以上是关于显示图像时出错的主要内容,如果未能解决你的问题,请参考以下文章

Azure Blob 存储 - 显示上传的图像时出错

Android:使用位图使用android studio显示图像时出错

显示表格内的图像时出错!斯威夫特 3

Jcrop 图像在预览中无法正确显示

尝试根据轮播上出现的图像更改标题和描述时出错

VS2010 创建控件时出错 无法显示此控件,因为该控件的TagPrefix未在此WEB表单中注册