swift - Completion 很快就会被调用

标签 swift swift3 alamofire

我有以下功能。我试图将 allItems 数组传递到 requestItems 的完成 block 中,但我遇到了崩溃,因为它说它为 nil。我删除了完成以检查 item 是否有值,它确实有值。

这意味着完成在 for 循环之前执行。

还有其他方法吗?类似于 Javascript 中的 Promises,它将在 for 循环完成时执行完成。

func requestItems(_ data: [String: Any], completion: (Bool, [Item]) -> Void) {

    var allItems = [Item]()

    for i in data["all"] {

        Routes.instance.getRequest(requestType: "items", params: nil, id: someId, completion: { item in

            var it = Item(item["name"] as! String)
            allItems.append(it)

        })

    }

    completion(true, allItems)
}

func getRoutes(requestType: String, parameters: [String: Any]?, id: String, completion: @escaping ([[String:Any]]) -> Void) {

    DispatchQueue.main.async {

        if id == "" {
            self.url = "\(URL_BASE)/\(requestType)"

        } else {
            self.url = "\(URL_BASE)/\(requestType)/\(id)"
        }

        Alamofire.request(self.url, method: .get, parameters: parameters, encoding: JSONEncoding.default, headers: self.headers).responseJSON { response in

            guard response.result.error == nil else {
                print(response.result.error!)
                return
            }

            switch response.result {

            case .success(let JSON):
                let response = [JSON] as! NSArray

                for item in response {

                    if let data = item as? [String: Any] {
                        print(data)
                    }
                }

                completion(response as! [[String : Any]])

            case .failure(let error):
                print("Request failed with error: \(error)")
            }
        }
    }

}

完成处理程序执行得太快,返回一个 nil 项

最佳答案

您需要 DispatchGroup 来在异步循环完成时得到通知,例如:

func requestItems(_ data: [String: Any], completion: (Bool, [Item]) -> Void) {

    var allItems = [Item]()
    let group = DispatchGroup()
    for i in data["all"] {
        group.enter()
        Routes.instance.getRequest(requestType: "items", params: nil, id: someId, completion: { item in

            let it = Item(item["name"] as! String)
            allItems.append(it)
            group.leave()

        })
    }
    group.notify(queue: DispatchQueue.main) {
        completion(true, allItems)
    }
}

关于swift - Completion 很快就会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45484563/

相关文章:

Swift 相机应用程序 - 启用横向模式右/左

ios - 如何提示用户在 AppDelegate 之外接受推送通知?

swift3 - Swift 2.3 到 Swift 3.0 对成员 'joined' 出现模糊引用错误

ios - AlamofireObjectMapper 在应该给我值(value)的时候得到了 nil

ios - 使用 Alamofire (iOS) 从 OMDb API 获取数据

nsurlconnection - 在 NSURLSession/NSURLConnection 上使用 Alamofire 进行网络有什么优势?

ios - iOS 中的图像预加载

swift - 如何以编程方式为选择器 View 设置标签?

swift - Xcode 8.2.1 不显示自动完成的文档描述

ios - 快速更改 contactUI 'forNewContact' 的标题