异步 NSImage 下载:第一个图像无限加载

Posted

技术标签:

【中文标题】异步 NSImage 下载:第一个图像无限加载【英文标题】:Asynchronous NSImage download: first image has infinite loading 【发布时间】:2015-09-12 20:03:10 【问题描述】:

我正在尝试使用 NYTPhotoViewer 和异步图像下载为 react-native 制作一个模块。它可以工作,但是当其他下载和显示时,第一张图像永远不会停止动画加载。有趣的是,如果我滑动一些图像(2 个或更多),第一个图像将呈现。代码在这里:

#import <NYTPhotoViewer/NYTPhotosViewController.h>
#import "NYTImageViewer.h"
#import "NYTExamplePhoto.h"

@interface NYTImageViewer () <NYTPhotosViewControllerDelegate>
  @property (nonatomic) NSArray *photos;
@end

@implementation NYTImageViewer

RCT_EXPORT_MODULE()

RCT_EXPORT_METHOD(open:(NSArray *)urls)

  dispatch_async(dispatch_get_main_queue(), ^
    NSArray *photos = addPhotos(urls);

    NYTPhotosViewController *photosViewController = [[NYTPhotosViewController alloc] initWithPhotos:photos];

    UIViewController *ctrl = [[[[UIApplication sharedApplication] delegate] window] rootViewController];

    [ctrl presentViewController:photosViewController animated:TRUE completion: nil];
  );


NSArray* addPhotos(NSArray *urls) 
  NSMutableArray *photos = [NSMutableArray array];
  for (int i = 0; i < [urls count]; i++) 
    NYTExamplePhoto *photo = [[NYTExamplePhoto alloc] init];
    dispatch_async(dispatch_get_global_queue(0,0), ^
      NSData * imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: urls[i]]];
      if ( imageData == nil )
        return;
      dispatch_async(dispatch_get_main_queue(), ^
        photo.image = [UIImage imageWithData: imageData];
      );
    );
    [photos addObject:photo];
  

  return photos;

@end

我该如何解决?

【问题讨论】:

您在photo.image = ... 之后尝试过[photo setNeedsDisplay:YES] 吗? 【参考方案1】:

您不应该/不能从远程 URL 以这种方式加载,并且使用 dispatch_async 它会生成预期的行为:

NSData * _data = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: urls[i]]];

您必须通过异步方法使用NSURLSessionNSURLConnection 进行远程调用,并且您必须在回调中处理递归。

【讨论】:

以上是关于异步 NSImage 下载:第一个图像无限加载的主要内容,如果未能解决你的问题,请参考以下文章

将 NSImage 保存到路径不起作用

使用 Angular 和 RxJS 实现的无限滚动加载

如何防止 PDFKit/NSImage 中的渲染伪影?

使用来自异步 NSURLConnection 的数据填充 NSImage

使用IBDesignable以编程方式从Assets访问NSImage

iOS - 在 AFNetworking 异步图像下载线程完成后重新加载 UITableView