我怎样才能等到下载完成?

How can i wait until download will be finished?

我的想法很简单: 1. 我有一个带按钮的 ViewController 2.点击按钮后我想从我的网站获取数据 3. 我想放置有关数据正在下载的指标信息 4.完成后显示消息OK或NOT OK

我有一个 class CCClass

class CCClass {

let CCClass BaseURL: NSURL?
var seed: String?

init() {
    CCClassBaseURL = NSURL(string: "mysiteblabla")
}

func getData() {
    if let CCClassURL = NSURL(string: "", relativeToURL: CCClassBaseURL ) {
        let networkOperation = NetworkOperation(url: CCClassURL)
        networkOperation.downloadJSONFromURL {
            (let JSONDictionary) in
            print(JSONDictionary?["seed"])
            self.seed = JSONDictionary?["seed"] as? String
        }
    } else {
        print("Cold not construct a valid URL")
    }
}

}

点击按钮我有

let ccClass = CCClass()

ccClass.getData() {  
    (let test) in
     dispatch_async(dispatch_get_main_queue()) {
         // go to something on the main thread
         print(ccClass.seed)
    }
}

我有错误:无法使用类型为“((_) -> _)”的参数列表调用 'getData'

而且我不确定我是否应该在函数 getData 中创建数组并 return 到主线程?下载数据后,我想将其用于下一个 http 查询。

您正在调用带有尾随闭包的 getData,但 getData 的定义不采用闭包参数(或调用它)。如果您更改获取闭包的方法并使用它(可能将下载结果传回),您所拥有的将会起作用。

如果你想用尾随闭包调用它,你必须在你的方法中声明一个闭包参数:

func getData( completion:()->() ) {
    if let CCClassURL = NSURL(string: "", relativeToURL: CCClassBaseURL ) {
        let networkOperation = NetworkOperation(url: CCClassURL)
        networkOperation.downloadJSONFromURL {
            (let JSONDictionary) in
            print(JSONDictionary?["seed"])
            self.seed = JSONDictionary?["seed"] as? String
            completion()
        }
    } else {
        print("Cold not construct a valid URL")
        completion()
    }
}

要遵循的一个好的经验法则是,任何采用某种 "completion" 闭包的方法都应始终调用该闭包,即使操作失败也是如此。因此,请确保在 else 块中调用 completion(),其中 URL 构造失败,或者发生网络错误,或者发生 JSON 解析错误。