gpt4 book ai didi

ios - SDWebImage 下载后不显示(仅在重新打开 VController 后)

转载 作者:行者123 更新时间:2023-12-01 16:29:25 25 4
gpt4 key购买 nike

我正在尝试使用以下方法加载 3 张图像。问题是,我没有从我的完成 block 中收到任何错误,并且所有 3 个图像仅在我关闭 detailedViewController 并重新打开它后显示。

我错过了什么?感谢您的帮助,非常感谢。

- (UIImage*)loadImageFav1:(NSString *)nameEmail
{

UIImageView *img =[[UIImageView alloc]init];
// NSString *strBack = [NSString stringWithFormat:@"%@%@%@", self.urlPrefix,[self.selectedProfile objectForKey:nameEmailPro],@"_B.png"];
NSString *strProfi = [NSString stringWithFormat:@"%@%@%@", self.urlPrefix,nameEmail,@"_fav1.png"];
//
// NSURL *bkgUrl = [NSURL URLWithString:[strBack stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSURL *f1Url = [NSURL URLWithString:[strProfi stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
// // set imges below


NSLog(@"selected fprofile ......str data...%@",strProfi);
////////strt

weakImageViewF1= self.friendImageView1;
[img sd_setImageWithURL:f1Url
placeholderImage:[UIImage imageNamed:@"profile-1.jpg"]
options:SDWebImageRetryFailed
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

NSLog(@"error...back..log %@", error);

if (image) {
// Update model to say that the image was downloaded

NSLog(@"Complete...Background...SSSSSS");

weakImageViewF1.image = image;
[weakImageViewF1 setNeedsLayout];
}
}];
//////
// Test simple call
// [img sd_setImageWithURL:f1Url placeholderImage:[UIImage imageNamed:@"profile-1.jpg"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
// if(error){
// NSLog(@"Callback Error:%@",error);
// }
// if(image){
// NSLog(@"Callback Image:%@",image);
// }
// }];


return img.image;


}

在 ViewDidAppear 中调用所有 3 张图像

if ([self loadImageFav1:self.emailID] != nil) {

// call the same method on a background thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

UIImage *tmpF1 = [self loadImageFav1:self.emailID];
UIImage *tmpF2 = [self loadImageFav2:self.emailID];
UIImage *tmpF3 = [self loadImageFav3:self.emailID];

// update UI on the main thread
dispatch_async(dispatch_get_main_queue(), ^{

self.friendImageView1.image = tmpF1;
self.friendImageView2.image = tmpF2;
self.friendImageView3.image = tmpF3;


});

});

/////可以使用,但希望得到解释 - 谢谢

所以为了让它工作,我直接将 sdWebImageWithURL 设置为我的原始 ImageView 并停止使用临时 UIImageView *img = [[UIimageVew alloc]init];

我从:

[img sd_setImageWithURL:f1Url placeholderImage:[UIIm...

收件人:

[self.friendImageView1 sd_setImageWithURL:f1Url  placeholderImage:[UIIm...

最佳答案

这是一个并发问题。 SDWebImage 已经是异步的,因此您通过执行自己的手动异步线程来搞砸它。

你说的是:

  1. 在新的后台线程(线程 A)中,开始下载图像。
  2. 这个新的后台线程(线程 A)正在启动它自己的后台线程(线程 B,SDWebImage 正在为您执行此操作)。
  3. 您的后台线程 A 结束。
  4. dispatch_get_main_queue 部分中的代码运行,但线程 B 仍在下载这些图像,因此它们尚不可用。

它们下次出现的原因是因为 SDWebImage 已经在第一次尝试时缓存了它们。

要解决此问题,您应该将 dispatch_get_main_queue 部分中运行的代码移动到 SDWebImage 调用的 completed block 中。

编辑:

您的更改得到修复的原因是因为 SDWebImage 负责将 UIImage 加载到您首先提供的 UIImageView 中。因此,您最初是说“将此图像加载到我名为 imgUIImageView 中,并将该图像分配给另一个名为 self 的 UIImageView。 friendImageView1”,但当时分配给 img 的当前图像是占位符图像,因为来自互联网的图像尚未下载。就像我说的,SDWebImage 在后台线程中自动为您下载,下载完成后,它会将下载的图像分配给您调用它的 UIImageView。所以基本上你的原始代码只是添加了一个额外的中间人。

关于ios - SDWebImage 下载后不显示(仅在重新打开 VController 后),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32787898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com