Swift URL 响应为零

Swift URL Response is nil

我创建了一个自定义 DataManager class。在其中我想在一个方法中获取数据,然后 return 一个 NSData 对象转换为 JSON。

我尝试使用 completionHandler 获取数据,但没有成功:

class func fetchData() -> NSData? {
    var session = NSURLSession.sharedSession(),
        result = NSData?()
    let DataURL : NSURL = NSURL(string: "http://...file.json")!

    let sessionTask = session.dataTaskWithURL(DataURL, completionHandler: { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
        result = data
    })
    sessionTask.resume()
    return result
}

dataTask 异步运行。这意味着完成处理程序闭包不会在您从 fetchData return 时调用。因此,result 尚未设置。

因此,您不应尝试从异步方法同步检索数据。相反,您应该自己使用异步完成处理程序模式:

class func fetchData(completion: @escaping (Data?, Error?) -> Void) {
    let session = URLSession.shared
    let url = URL(string: "http://...file.json")!

    let task = session.dataTask(with: url) { data, response, error in
        completion(data, error)
    }
    task.resume()
}

你会这样称呼它:

MyClass.fetchData { data, error in
    guard let data = data, error == nil else {
        print(error ?? "Unknown error")
        return
    }

    // use `data` here; remember to dispatch UI and model updates to the main queue
}

// but do not try to use `data` here

...

仅供参考,对于 Swift 3 之前的原始语法,请参阅 previous revision of this answer