我想获取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 {
}
}
}
}
答案 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)
}
}
我希望这对您有帮助