我怎么能等到下载完成?

时间:2015-08-14 18:41:53

标签: swift swift2

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

我有一堂课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中创建Array并返回主线程吗?在下载数据之后,我想将此用于下一个http查询。

2 个答案:

答案 0 :(得分:2)

您正在使用尾随闭包调用getData,但.fade_background { background-color: black; opacity: 0.65; } 的定义并未采用闭包参数(或调用它)。如果您更改方法以获取闭包并使用它(可能会将下载结果传回),您所拥有的将会起作用。

答案 1 :(得分:1)

如果要使用尾随闭包调用它,则必须在方法中声明一个闭包参数:

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,其中URL构造失败,或者发生网络错误,或者发生了JSON解析错误。