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]?)-> () ) {
    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