This question already has answers here:
iOS - Swift - Function that returns asynchronously retrieved value
(3个答案)
9个月前关闭。
编辑:按照@ShúKhan的建议,在以下代码的帮助下,成功地将JSON检索到简单的整数数组中,谢谢👍。
这是完成代码
private func fetchFeedForURLString(urlString:String,完成:@转义([Int]?)-> () ) {
这是我用来调用上述回调函数的中间调用方
上面的中间代码是从问题开始的viewController调用的。这是密码
在这里,我将检索到的receivedArray分配给articledIds的本地副本。如果我打印以下变量
在回调函数之外,它返回一个nil。但我把它印在封盖里面,它印出了所有的东西。
如何将值从异步方法复制到本地变量?
然后回到这里
其次,在解码和编码中使用
第三个不要错过的函数是异步的,因此即使在返回在响应返回之前运行时有响应,返回也会给出空数组
应该是
然后像这样打电话
(3个答案)
9个月前关闭。
编辑:按照@ShúKhan的建议,在以下代码的帮助下,成功地将JSON检索到简单的整数数组中,谢谢👍。
这是完成代码
private func fetchFeedForURLString(urlString:String,完成:@转义([Int]?)-> () ) {
if let url = URL(string: urlString) {
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else {completion(nil); return}
do {
let numberArray = try JSONDecoder().decode([Int].self, from: data)
completion(numberArray)
}
catch {
print (error)
}
}
task.resume()
}
else {
completion (nil)
}
这是我用来调用上述回调函数的中间调用方
func fetchArticles(completion: @escaping ([Int]?) -> ()) {
fetchFeedForURLString(urlString: "\(baseURL)/\(ExtendBaseURL.topStories)", completion: completion)
}
上面的中间代码是从问题开始的viewController调用的。这是密码
private func fetchArticles() {
ApiService.shared.fetchArticles() { (receivedArray: [Int]?) in
self.articleIds = receivedArray
}
}
在这里,我将检索到的receivedArray分配给articledIds的本地副本。如果我打印以下变量
var articleIds
在回调函数之外,它返回一个nil。但我把它印在封盖里面,它印出了所有的东西。
如何将值从异步方法复制到本地变量?
最佳答案
首先,在这里把数据转换成String
是没有意义的
if let data = data, let string = String(data: data, encoding: .utf8) {
然后回到这里
let jsonData = Data(string.utf8)
其次,在解码和编码中使用
Data
非常重要,要知道当前的问题是什么do {
let strArr = try jsonDecoder.decode([Int].self, from:data)
}
catch {
print(error)
}
第三个不要错过的函数是异步的,因此即使在返回在响应返回之前运行时有响应,返回也会给出空数组
private func fetchFeedForURLString(urlString: String) -> [Int]?
应该是
private func fetchFeedForURLString(urlString: String,completion:@escaping ( [Int]? ) -> () ) {
if let url = URL(string: urlString) {
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else { return }
do {
let numberArray = try JSONDecoder().decode([Int].self, from:data)
completion(numberArray)
catch {
print(error)
completion(nil)
}
}
task.resume()
}
}
else {
completion(nil)
}
}
然后像这样打电话
fetchFeedForURLString(urlString:<#YourUrl#>) { arr in
if let arr = arr {
print(arr)
}
}
关于arrays - 无法使用Swift 4.0将检索到的JSON复制到简单的整数数组中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54585315/
10-12 15:44