等待执行 return 的关闭结果

Wait for closure result for doing the return

我得到了一本书 reader 编码为 Swift,第一章没问题,但是当我尝试从 web 服务加载第二章时(这些书逐章来自服务器) ,页面viewcontroller的数据源方法必须return一个viewcontroller,它不等待获取新章节的闭包,它总是return 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,然后 return 它在 onCompletePage 块上,问题是,它总是在闭包结束之前到达 return nil 行,所以它不起作用。我想等待关闭,获得 pagecontentviewcontroller,然后 return 结果。一些想法?

看看我的 Swift 库,它有一堆函数可以在异步函数和同步函数之间转换:https://github.com/Kametrixom/Swift-SyncAsync 网站上有很多示例,还有非常详细的游乐场

你可以这样做:

return toSync(pageContentViewControllerAtIndex)(currentPageInSpineIndex!)

编辑:您正在进行网络请求 -> 异步!

pageViewController:viewControllerAfterViewController: 方法需要 UIViewController(或子类)returned,您将无法在此方法中使用异步代码来创建和 return 一个视图控制器。

基于等待异步方法完成的建议是不合适的。这是因为 UIPageViewController 委托方法是在主线程上调用的,引入任何等待机制都会阻塞 UI 导致无响应的感觉并可能导致系统终止应用程序。

我建议做的是创建一个视图控制器,return 它,并从该视图控制器加载内容。在检索到内容之前,您很可能希望在该视图上显示某种加载指示器。