如何在swift中创建依赖运行的函数依赖?换句话说,我希望一个函数等到另一个函数成功完成其任务。
var sales : NSMutableArray! = NSMutableArray()
var items : NSMutableArray! = NSMutableArray()
override func viewDidLoad() {
super.viewDidLoad()
这是我需要帮助的地方,下面的调度方法不能正常工作,我得到“索引0超出空数组的边界”错误,因为数组没有填充但我想。另外我不确定如果这是处理这个问题的正确方法......
/*
dispatch_async(queue, {
dispatch_sync(queue, {
self.downloadItems()
})
dispatch_sync(dispatch_get_main_queue(), {
self.displayItems()
})
})
*/
}
func downloadItems() {
let urlPath = "……………………………"
let url = NSURL(string: urlPath)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in
if (error != nil) {
println(error)
} else {
let jsonResult: AnyObject = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil)!
dispatch_async(dispatch_get_main_queue()) {
for var i = 0; i < jsonResult.count; i++ {
self.sales[i] = jsonResult[i]["daily_sales"] as NSString
}
}
}
})
task.resume()
}
func displayItems() {
self.items.addObject(["amount": self.sales[0]])
}
答案 0 :(得分:0)
使用&#39;继续传递风格&#39;。您的操作downloadItems()
将使用函数执行一次downloadItems()
完成后执行的参数 - 该参数类似于continuation
(某些语言公开,有关详细信息,请参阅Scheme和ML)。所以它看起来像:
func downloadItems (continuation: (Void -> Void)!) {
let urlPath = // ...
// ...
if nil != continuation { continuation() }
}
然后您将其与
一起使用self.downloadItems { [self unowned] in self.displayItems() }