我怎样才能等到下载完成?
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 解析错误。
我的想法很简单: 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 解析错误。