我有一个用Swift编写的书籍阅读器,第一章没问题,但是当我尝试从webservice加载第二章(书籍来自服务器的章节)时,pageviewcontroller的数据源方法必须返回一个viewcontroller,它不会等到获取新章的闭包,它总是返回nil。我尝试过使用dispatch_semaphore_t,dispatch_group_t等,但我没有得到它。方法如下:
// MARK: - PageViewControllerDataSource
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
if self.currentPageInSpineIndex! + 1 < self.currentChapterPages {
self.currentPageInSpineIndex!++
} else if self.selectedChapter + 1 < self.tale?.chapters.count {
self.selectedChapter++
self.currentPageInSpineIndex = 0
}
self.pageContentViewControllerAtIndex(self.currentPageInSpineIndex!, onCompletePage: { (let pageContentViewController: PageContentViewController) -> Void in
return pageContentViewController
})
return nil
}
pageContentViewControllerAtIndex方法检查de DB是否有章节的文本,如果没有,它会询问服务器,然后创建一个带有文本的pagecontentviewcontroller,然后在onCompletePage块上返回它,事实是,它总是在关闭结束前到达返回零行,所以它不起作用。我想等待关闭,有pagecontentviewcontroller,然后返回该结果。一些想法?
答案 0 :(得分:3)
pageViewController:viewControllerAfterViewController:
方法需要返回UIViewController
(或子类),您将无法在此方法中使用异步代码来创建和返回视图控制器。
基于等待异步方法完成的建议是不合适的。这是因为在主线程上调用UIPageViewController
委托方法,并且引入任何等待机制将阻止UI,从而导致无响应的感觉并可能导致系统终止应用程序。
我建议做的是创建一个视图控制器,返回它,并从该视图控制器加载内容。很可能你会想要在该视图上显示某种加载指示符,直到检索到内容为止。
答案 1 :(得分:0)
看一下我的Swift库,它有一堆函数可以在异步和同步函数之间进行转换:https://github.com/Kametrixom/Swift-SyncAsync网站上有很多例子,还有一个非常详细的游乐场
你可以做一些事情:
return toSync(pageContentViewControllerAtIndex)(currentPageInSpineIndex!)
编辑:您正在进行网络请求 - &gt;异步!