Swift中函数的依赖关系

时间:2015-01-01 13:35:07

标签: ios swift

如何在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]])

}

1 个答案:

答案 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() }