Images Persistence and Lazy Loading Conflict With Dispatch_Async

瘦欲@ 提交于 2019-12-05 18:24:09

After reading your comment, I tend to think that the issue has to do with how you persist the images relative to the dispatch_async block. I will try to explain, but this is just a guess, since I don't know where you persist the image:

  1. at some point your parser:foundCDATA: is executed and you retrieve asynchronously your image;

  2. the image will not be there for some time (until the sync block completes), so the thumbnail ivar/property will not have the right value for some time after completing parser:foundCDATA:;

  3. now, if you persist thumbnail before the async block completes, you will persist the wrong (nil?) value;

  4. the fact that if you do not execute the fetching of the image asynchronously, then everything works, makes me think that you are persisting the image too early (in the above sense).

The fix to this would be persisting the image only after the async block completes. This could mean something like:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

  NSString *someString = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];
  NSString *storyImageURL = [self getFirstImageUrl:someString];

  NSURL *tempURL = [NSURL URLWithString:storyImageURL];

  NSData *tempData = [NSData dataWithContentsOfURL:tempURL];
  thumbnail = [UIImage imageWithData:tempData];

  <code here to make the thumbnail be persisted>

});

<code here to make the thumbnail be persisted> could be a method call, a notification post, whatever fits your current design. You might also need to use the trick of dispatching the call to the main thread if your persistence code is not thread safe:

  dispatch_async(dispatch_get_main_queue(), ^{
      <persist thumbnail>;
  }

Hope it helps.

EDIT:

After our chat, the above analysis is confirmed. In fact, you are not simply downloading one image: you are downloading a bunch of images, all belonging to the same "channel". This means that the persist operation, which is applied to the whole channel, shall be executed only after all of those images have been downloaded.

I have thus forked your gist and added some logics enabling the use of GCD dispatch_group to keep track of all the download operations. You can find it here.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!