如何使用 NSURL 等待异步请求完成?
How can I wait for an asynchronous request to finish using NSURL?
我曾尝试将此代码转换为使用“sendSynchronousRequest()”,但没有成功,因为 SO 上的大多数资源都已过时。
我正在尝试从 API 收集数据。然后它用我需要的信息创建了一个 Marvel Characters 数组。整个代码工作正常,但数组是空的,因为它 returns 请求完成之前的数据。如何等待数据?
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
}
你必须等到所有接收到的数据都没有附加到本地数组,然后你必须调用完成。
因此,不用 return 类型,而是在参数
中添加完成处理程序
static func getCharacters(_ completion: @escaping ([MarvelCharModel]) -> () )
然后在 foreach 循环调用之后 completion
for dataCharacter in results {
...
}
completion(getFavourite(characters: CharactersFromApi))
然后你可以调用这个方法,你可以在它的闭包中访问 received MarvelCharModel
Foo.getCharacters { characters in
... // do what you need when completion is called
}
我曾尝试将此代码转换为使用“sendSynchronousRequest()”,但没有成功,因为 SO 上的大多数资源都已过时。
我正在尝试从 API 收集数据。然后它用我需要的信息创建了一个 Marvel Characters 数组。整个代码工作正常,但数组是空的,因为它 returns 请求完成之前的数据。如何等待数据?
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
}
你必须等到所有接收到的数据都没有附加到本地数组,然后你必须调用完成。
因此,不用 return 类型,而是在参数
中添加完成处理程序static func getCharacters(_ completion: @escaping ([MarvelCharModel]) -> () )
然后在 foreach 循环调用之后 completion
for dataCharacter in results {
...
}
completion(getFavourite(characters: CharactersFromApi))
然后你可以调用这个方法,你可以在它的闭包中访问 received MarvelCharModel
Foo.getCharacters { characters in
... // do what you need when completion is called
}