如何从懒惰的set var中的完成处理程序返回

时间:2018-12-30 00:49:28

标签: ios swift lazy-initialization completionhandler

我想获取api以从惰性var中的服务器获取内容。以下是我的代码,我不确定如何使其工作。有什么线索吗?我知道我们无法从完成处理程序返回,所以我在这里迷路了。不知道有什么其他方法可以做到这一点?

private(set) lazy var orderedViewControllers: [UIViewController] = {
        self.fetchPages()
    }()

func fetchPages() -> [UIViewController] {
    fetchIntroPages() { (result, error) in
        if error != nil {
        } else {
            if result?.data != nil { 
                if (result?.success)! {
                    var newColoredViewControllerArray: [UIViewController] = []
                    for page in result!.data! {
                        newColoredViewControllerArray.append(self.newColoredViewController(pageId: page.id!, pageTitle: page.title!, pageContent: page.content!))
                    }
                    // This will not work
                    return newColoredViewControllerArray
                }
            } else { 
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

首先,在进行异步调用时,不要返回结果,而应使用完成处理程序

http://foo.com

然后不要使用func fetchPages(_ completion: @escaping ([UIViewController]?) -> ()) { fetchIntroPages() { result, error in ... if let result = result { if result.success { ... completion(newColoredViewControllerArray) return } } } completion(nil) } } 变量,因为您进行异步调用后就无法提供返回值。如果需要,请仅使用“普通”存储的 变量

lazy

现在在需要的地方调用var orderedViewControllers: [UIViewController]? 并在其结束符中分配变量

fetchPages

答案 1 :(得分:-1)

您可以声明[UIViewcontroller]的全局数组,并在完成块时使用信号灯

func fetchPages() -> [UIViewController] {
    var newColoredViewControllerArray = [UIViewController]()
    var semaphore = DispatchSemaphore(value: 0)
    fetchIntroPages() { (result, error) in
        if error != nil {
        } else {
            if result?.data != nil {
                if (result?.success)! {
                    for page in result!.data! {
                        newColoredViewControllerArray.append(self.newColoredViewController(pageId: page.id!, pageTitle: page.title!, pageContent: page.content!))
                    }
                }
            }
        }
        semaphore.signal()
    }
   semaphore.wait()
   return newColoredViewControllerArray
}

或 您可以通过使用完成

返回viewcontroller数组
func fetchPages(arrViewController:block) {
    var newColoredViewControllerArray = [UIViewController]()
    fetchIntroPages() { (result, error) in
        if error != nil {
        } else {
            if result?.data != nil {
                if (result?.success)! {
                    for page in result!.data! {
                        newColoredViewControllerArray.append(self.newColoredViewController(pageId: page.id!, pageTitle: page.title!, pageContent: page.content!))
                    }
                }
            }
        }
        arrViewController(newColoredViewControllerArray)

    }
}

我希望这对您有帮助