相关疑难解决方法(0)

使用url设置UIImageView图像

是否可以读取图像的URL并将UIImageView设置为此URL的图像?

iphone uiimageview

38
推荐指数
5
解决办法
9万
查看次数

在后台线程中加载UIImage会导致ImageIO错误

我正在开发一个iOS项目,它从后台线程中的URL加载UIImages,并在水平分页滚动视图中显示它们.此行为应该模仿iPhone的本机照片库应用程序.我以一种我认为应该工作的方式设置所有内容,但是在主UI图形上下文中绘制UIImages时,我偶尔会在控制台中看到此消息:

ImageIO: <ERROR>  CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedImageBlockData: bad readSession [0x685e590]
Run Code Online (Sandbox Code Playgroud)

尽管出现此错误,但似乎应用程序功能完美,并且图像按预期绘制.我应该简单地忽略这个"错误",还是应该改变我在后台线程中加载图像的方法?目前,我使用UIImage initWithData:方法在后台线程中加载图像:

- (void)backgroundLoadThread:(NSURL *)url {
    @autoreleasepool {
        NSData * imageData = [NSData dataWithContentsOfURL:url];
        UIImage * theImage = [[UIImage alloc] initWithData:imageData];
        if ([[NSThread currentThread] isCancelled]) {
#if !__has_feature(objc_arc)
            [theImage release];
#endif
            return;
        }
        [self performSelectorOnMainThread:@selector(loadComplete:)
                               withObject:theImage waitUntilDone:NO];
    }
}
Run Code Online (Sandbox Code Playgroud)

我的loadComplete:方法只是保留作为实例变量传递的图像,稍后在视图的drawRect:方法中绘制.在drawRect:,我正在使用UIImage drawInRect:方法,它似乎是控制台中错误消息的实施者.但是,使用图像的基础CGImageRef CGContextDrawImage仍会导致相同的错误.完整的源代码可以在这个项目的Github存储库中的ANAsyncImageView.m文件中找到.

编辑:我现在已经更改后台线程从文件加载CGImage,然后回调到主线程,使用免费桥接传递CGImageRef.不幸的是,这仍然会产生同样的问题,向我证明UIImage imageWithCGImage:必须以某种方式保留对原始CGImage的引用.查看上面链接的文件中的代码(到Github存储库)以获取完整代码:

NSData * imageData = [NSData dataWithContentsOfURL:url];
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)imageData);
CGImageRef loaded = …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch core-graphics uikit uiimage ios

1
推荐指数
1
解决办法
6001
查看次数

标签 统计

cocoa-touch ×1

core-graphics ×1

ios ×1

iphone ×1

uiimage ×1

uiimageview ×1

uikit ×1