简单的完成处理程序或swift中的回调

时间:2015-01-02 20:33:24

标签: ios swift

我有以下代码,它请求一些JSON对象,然后调用一个函数从服务器获取基于这些标记的图像。我正在重构我的代码,以便在请求完成时不强制我的UICollectionView重新加载,所以我只想在用户触发先前视图的tableview segue时收集图像。在prepareForSegue()中,我有以下代码:

let priority = DISPATCH_QUEUE_PRIORITY_BACKGROUND
            dispatch_async(dispatch_get_global_queue(priority, 0)) {

                self.performTagRequest(tagText!)
                self.imageRequestCompletionBool = self.requestImages(self.tagResultObject)

            }    
            (segue.destinationViewController as PhotoViewController).detailItem = globalImageArray

如果performTagRequest()函数完成后,我将如何调用requestImages()函数,然后才设置详细信息项?

我只想避免在较大的通话中比赛。

performTagRequest的代码是

func performTagRequest(detail : String) {
    var request = HTTPTask()
    var formattedDetail = detail.stringByReplacingOccurrencesOfString("\"", withString: "", options: NSStringCompareOptions.LiteralSearch, range: nil)
    var url = "http://www.gifbase.com/tag/\(formattedDetail)?format=json"
    url = url.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
    request.GET(url, parameters: nil, success: {(response: HTTPResponse) in
        if response.responseObject != nil {
            let data = response.responseObject as NSData
            var tagResponse = TagResponse(JSONDecoder(data)) //Json Object of all image url
            self.tagResultObject = tagResponse
        }
        },failure: {(error: (NSError, HTTPResponse?)) in
            println("error: \(error)")
    })

}

1 个答案:

答案 0 :(得分:6)

看起来你需要一个完成处理程序。 将performTagRequest()的声明更改为:

func performTagRequest(tagText: String!, completion: (() -> Void)!)

并且在performTagRequest()的末尾添加:

completion()

运行完成代码。

然后这样称呼:

self.performTagRequest(tagText!){
    self.imageRequestCompletionBool = self.requestImages(self.tagResultObject)
}

为简单起见,上面使用尾随闭包,但您可以这样称呼它:

self.performTagRequest(tagText!, completion:{
            self.imageRequestCompletionBool = self.requestImages(self.tagResultObject)
})

如果您想在其后添加其他参数。