我正在使用 UIPageViewController
用于显示图像,我异步下载图像并在它们准备好后将它们放入画廊(但您仍然可以转到图像将所在的画廊页面)。
我的问题是,当图像确实加载时,我需要为它对应的 View Controller 提供它。现在,我将它添加到 NSCache
实例,当UIPageViewController
的数据源方法viewControllerAfterViewController:
被调用时,我检查所请求的 View Controller 的图像是否已经下载(在缓存中),如果是,我调用 initWithImage:
在特定的 View Controller 上,传递下载的图像。
我的问题是什么时候 viewControllerAfterViewController:
被调用,图像还没有被下载。现在我只加载没有图像的 View Controller ,当 imageDidFinishDownloading:
委托(delegate)方法被调用时,我尝试为 View Controller 提供图像。
然而,似乎即使UIPageViewController
要求显示前一个 View Controller 的下一个 View Controller (即:当我到达第 3 页时,它请求第 4 页的 View Controller )我无法访问我移交的这个请求的 View Controller .
如果我访问 pageViewController.viewControllers
, NSArray
的计数从不 超过 1。因此,即使它看起来应该有 2 个(当前显示的 View Controller 和它请求的下一个),但它只有一个,即当前可见的 View Controller 。
问题是我需要另一个。图片下载完成,我真的只有两个选择。
- 给我的
NSCache
,所以当 View Controller 的 init 方法被调用时,它被移交。 - 如果它已经是
init
ed,将它交给已经是init
的 View Controller 编辑。
但 1 并不总是有效,有时 init
当还没有图像时调用方法(它还没有完成下载),所以我们有时会依赖 2,但是 pageViewController.viewControllers
只持有当前可见的 View Controller 。
所以基本上存在第三种情况,其中 View Controller 已经是init
。 ed 没有图像,图像完成下载,我想将它分配给那个 View Controller ,但我目前在它之前,我唯一引用 UIPageViewController
中的 View Controller 。在当前可见的那个上。
我如何处理 3?我需要为 View Controller 分配一些内容但我找不到任何方法来访问该 View Controller 。
最佳答案
我会使用来自 PMConcurrency 的类似 future 的东西去做这个。 Future 只是一个 promise 在图像可用时立即返回图像的对象。因此,通过将 future 交给您的 View Controller 而不是图像,您无需担心图像何时到达。
你的 View Controller 的初始化器看起来像这样:
- initWithImageFuture:(PMFuture *)future
{
if (self = [super init]) {
[[future onMainThread] onComplete:^(id result, NSError *error) {
if (!error) {
_image = result;
}
}];
}
return self;
}
通过为 future 添加一个 onComplete
block , View Controller 将在图像可用时立即接收图像(如果图像已经下载则立即接收)。 Futures 默认在后台运行,因此您可以使用 onMainThread
在主线程上返回结果。
因此,不是用图像填充缓存,而是用图像 futures 填充它。有多种创建 future 的方法,但基于区 block 的方法非常简单:
PMFuture *imageFuture = [PMFuture futureWithBlock:^id{
UIImage *image = ...; // Your image fetching code here
return image;
}];
[myCache setObject:imageFuture forKey:myImageKey];
关于ios - 在 UIPageViewController 中访问已经创建的 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21961471/