我如何等待使用NSURL完成的异步请求



我试图将此代码转换为使用'sendsynchronousrequest()’,但由于大多数资源的过时,所以没有运气。

我正在尝试从API收集数据。然后,它与我需要的信息创建了一系列漫威字符。整个代码工作正常,但是数组是空的,因为它在请求完成之前返回数据。我该如何等待数据?

static func getCharacters() -> Array<MarvelCharModel>{
    var CharactersFromApi = [MarvelCharModel]();
    let baseUrl = "https://gateway.marvel.com";
    let charUri = "/v1/public/characters";
    let apiKey  = "apikey=xxxxxxxxxxxxxxxxxxxx";
    let url = URL(string: baseUrl + charUri + "?" + apiKey)!
    var response: URLResponse?
    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.addValue("developer.marvel.com", forHTTPHeaderField: "Referer")
    NSURLConnection.sendAsynchronousRequest(request, queue: OperationQueue.main) {(response, data, error) in
        guard let data = data else { return }
        let responseJSON = try? JSONSerialization.jsonObject(with: data, options: [])
        if let responseJSON = responseJSON as? [String: Any] {
            if let dataInfo = responseJSON["data"] as? [String: Any] {
                let results = dataInfo["results"] as! NSArray;
                for dataCharacter in results {
                    let character = dataCharacter as? [String: Any];
                    let charId = character?["id"] as! Int;
                    let charName = character?["name"] as! String;
                    let charDesc = character?["description"] as! String;
                    let charPic = character?["thumbnail"] as! [String: Any];
                    let charPath = charPic["path"] as! String;
                    let charExt = charPic["extension"] as! String;
                    CharactersFromApi.append(MarvelCharModel(name: charName, desc: charDesc, pic: charPath + "." + charExt, id: charId));
                    // print(CharactersFromApi) <-- This shows correctly but clearly the return at the bottom is not waiting
                }
            }
        }
    }
    return getFavourite(characters: CharactersFromApi); // CharactersFromAPI is empty
}

您必须等到所有接收到的数据都没有附加到本地数组,然后您必须调用完成。

因此,没有返回类型,而是在参数中拥有完成处理程序

static func getCharacters(_ completion: @escaping ([MarvelCharModel]) -> () )

然后在foreach循环后致电completion

for dataCharacter in results {
    ...
}
completion(getFavourite(characters: CharactersFromApi))

然后您可以调用此方法,并且可以在其关闭中访问收到的MarvelCharModel

Foo.getCharacters { characters in
    ... // do what you need when completion is called 
}

最新更新