【问题标题】:How to wait the function execution until json loaded in Swift?如何等待函数执行直到在 Swift 中加载 json?
【发布时间】:2017-06-09 13:43:41
【问题描述】:

我从 url 获取 json 文件,然后,所有 json 输出将被添加到一个数组中。当我打印数组时,它说数组是空的,但实际上我知道数组不是空的。如果我使用like:DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { },那么,我可以打印数组。

我获取 json 并将其值添加到数组的代码:

var allTags:Array<String> = []
func getJSON(getUrl:URL){

    let url:URL = getUrl
    let session = URLSession.shared

    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData

    let task = session.dataTask(with: request as URLRequest) {
        (data, response, error) in

        let dataString =  String(data: data, encoding: String.Encoding.utf8)!

        do {
            let data = Data(dataString.utf8)
            let dictionaries = (try? JSONSerialization.jsonObject(with: data)) as? [[String:Any]] ?? []
            for dict in dictionaries {
                let tags = dict["Tags"] as? [String] ?? []
                for tag in tags {
                    allTags.append(tag)
                }
            }
        }
    }task.resume()
}

getJSON(getUrl: self.jsonUrl())

print(self.allTags.count) //it prints 0, but there are some data I know

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 
    print(self.allTags.count)  //it prints 168
}

【问题讨论】:

  • 尝试使用回调
  • 我该怎么做?我已经阅读了stackoverflow中的回调,但是,我无法将它实现到我的代码中...... @Rishi
  • 刚刚添加的答案
  • 如果需要参数,使用(parameter1: Type1, parameter2: Type2) -&gt; Void
  • 这是因为你的 session.dataTask 是异步的。这意味着它在后台线程中运行,而它下面的代码正常执行。 print(self.allTags.count) 不起作用的原因是它在从 URL 检索到任何数据之前执行。而asyncAfter 调用在半秒后执行,这对于检索数据来说已经足够长了。

标签: arrays json swift asynchronous swift3


【解决方案1】:

使用回调:

var allTags:Array<String> = []
func getJSON(getUrl:URL, callback: @escaping () -> Void) {
    let url:URL = getUrl
    let session = URLSession.shared
    var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData
    let task = session.dataTask(with: request as URLRequest) { (data, response, error) in
        let dataString =  String(data: data, encoding: String.Encoding.utf8)!
        do {
            let data = Data(dataString.utf8)
            let dictionaries = (try? JSONSerialization.jsonObject(with: data)) as? [[String:Any]] ?? []
            for dict in dictionaries {
                let tags = dict["Tags"] as? [String] ?? []
                for tag in tags {
                    allTags.append(tag)
                }
            }
            callback()
        }
    }
    task.resume()
}

getJSON(getUrl: self.jsonUrl()) {
    print(self.allTags.count) // Should work now
}

【讨论】:

    【解决方案2】:
        var allTags:Array<String> = []
        func getJSON(getUrl:URL, completion: @escaping () -> ()) {
    
            let url:URL = getUrl
            let session = URLSession.shared
    
            var request = URLRequest(url: url)
            request.httpMethod = "GET"
            request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData
    
            let task = session.dataTask(with: request as URLRequest) {
                (data, response, error) in
    
                let dataString =  String(data: data, encoding: String.Encoding.utf8)!
    
                do {
                    let data = Data(dataString.utf8)
                    let dictionaries = (try? JSONSerialization.jsonObject(with: data)) as? [[String:Any]] ?? []
                    for dict in dictionaries {
                        let tags = dict["Tags"] as? [String] ?? []
                        for tag in tags {
                            allTags.append(tag)
                        }
                    }
                completion()
                }
            }task.resume()
        }
    
        getJSON(getUrl: self.jsonUrl()) { [weak self] in
            guard let strongSelf = self else { return }
            print(strongSelf.allTags.count)
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多