我正在使用UIPageViewController
来显示图片,我会异步下载图像并在图片准备就绪时将它们放入图库中(但您仍然可以转到图库中的页面)图像将成为。)
我的问题是,当图像 加载时,我需要为它对应的视图控制器提供它。现在,我将它添加到NSCache
实例,当调用UIPageViewController
的数据源方法viewControllerAfterViewController:
时,我检查是否已经下载了所请求的视图控制器的图像(在缓存中)如果是,我在特定视图控制器上调用initWithImage:
,传递下载的图像。
我的问题在于调用viewControllerAfterViewController:
时图像尚未尚未下载。现在我只加载没有图像的视图控制器,当调用imageDidFinishDownloading:
委托方法时,我尝试为视图控制器提供图像。
然而,似乎即使UIPageViewController
要求下一个视图控制器显示上一个(即:当我到达第3页时,它请求第4页的视图控制器)我是无法访问我提交的请求的视图控制器。
如果我访问pageViewController.viewControllers
,则NSArray
的计数从不超过1.所以即使它看起来应该有2(当前显示的视图控制器)以及它所要求的下一个,它只有一个,当前可见的视图控制器。
问题是我需要另一个。图像完成下载,我真的只有两个选项。
NSCache
,所以当为视图控制器调用init方法时,它会被移交。init
,请将其移至已经init
编辑的视图控制器。但是1并不总是有效,因为有时当没有图像(它还没有完成下载)时调用init
方法,所以我们有时依赖于2,但是{{1} }只保存当前可见的视图控制器。
所以基本上第三种情况是视图控制器已经pageViewController.viewControllers
没有图像,图像完成下载,我想将它分配给那个视图控制器,但我现在正在那个在它之前,我对init
中视图控制器的唯一引用是当前可见的。
我该如何处理3?我需要为视图控制器分配一些内容,但我找不到任何方法来访问该视图控制器。
答案 0 :(得分:0)
我会使用来自PMConcurrency的未来来做这件事。未来只是一个承诺在图像可用时立即返回的对象。因此,通过将未来赋予视图控制器而不是图像,您无需担心图像何时到达。
您的视图控制器的初始化程序看起来像这样:
- initWithImageFuture:(PMFuture *)future
{
if (self = [super init]) {
[[future onMainThread] onComplete:^(id result, NSError *error) {
if (!error) {
_image = result;
}
}];
}
return self;
}
通过向未来添加onComplete
块,视图控制器将在可用时立即接收图像(如果图像已下载,则立即接收)。默认情况下,期货在后台运行,因此您可以使用onMainThread
在主线程上返回结果。
因此,不是用图像填充缓存,而是用图像期货填充它。有几种方法可以创建期货,但基于块的方法非常简单:
PMFuture *imageFuture = [PMFuture futureWithBlock:^id{
UIImage *image = ...; // Your image fetching code here
return image;
}];
[myCache setObject:imageFuture forKey:myImageKey];
答案 1 :(得分:0)
我有类似的功能,但我在显示图像的视图控制器中加载图像(VC传递给UIPageViewController)。在你的上下文中,我想我已经有了VC的图像ID信息和NSCache对象。当然,这不是你想要做的,而只是要考虑的事情。
最初我试图像你一样处理父母的图像加载。我记得,我保留了一个指向目标视图控制器的弱指针。当图像到达时,如果VC还活着,我可以设置UIImageView属性。