0

在我通过使用从我的服务器中两次提取相同的图像之前,它工作得很好,但我需要减少网络使用

NSString *friendAvatar = [NSString stringWithFormat:@"%@%@%@", @"http://www.mydomain.com/images/users/", myWords[0], @".jpg"];
[imageFile setImageWithURL:[NSURL URLWithString:friendAvatar]];
[bgImageFile setImageWithURL:[NSURL URLWithString:friendAvatar]]; //this is a zoomed in version of the friends photo

现在我正在使用这种方式来尝试提取已经拉出照片的 UIImageView 的图像,这样我就不必拉两次同一张照片......

NSString *friendAvatar = [NSString stringWithFormat:@"%@%@%@", @"http://www.mydomain.com/images/users/", myWords[0], @".jpg"];
[imageFile setImageWithURL:[NSURL URLWithString:friendAvatar]];
[bgImageFile setImage:imageFile.image];

尝试使用我的新方法时。什么都没发生。调试器中没有错误,背景图像只是空白。

4

2 回答 2

1

根据您的评论,我发现因为您AFNetworking在打电话时正在使用

[imageFile setImageWithURL:[NSURL URLWithString:friendAvatar]];

它正在后台线程上执行,但下一行

[bgImageFile setImage:imageFile.image];

不是 AFNetworking 调用,因此它在上一行完成之前执行,因此没有可使用的 imageFile.image...

所以,是的,我之前的回答要求你自己做异步代码,或者你可以在设置 bgImageFile.image 之前等待图像加载(这可能是用 KVO 完成的???)

于 2013-06-06T23:37:19.357 回答
1

尝试先创建一个 UIImage 然后将 UIImageView.image 设置为创建的 UIImage ...

UIImage *avatarImage = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:friendAvatar]]];

[imageFile setImage:avatarImage];
[bgImageFile setImage:avatarImage];

更好的方法是......

dispatch_queue_t myQueue = dispatch_queue_create("com.myProgram.myQueue", NULL);
dispatch_async(myQueue, ^{
    UIImage *avatarImage = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:friendAvatar]]];
    dispatch_async(dispatch_get_main_queue(), ^{
        [imageFile setImage:avatarImage];
        [bgImageFile setImage:avatarImage];
    });
});

这将在后台线程上从 Internet 加载文件,然后在图像加载完成后更新主线程上的 ImageViews。好处是您的应用在下载过程中不会冻结。

我希望这会有所帮助

于 2013-06-06T22:30:28.990 回答