swift 中的简单完成处理程序或回调
Simple completion handler or callback in 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
如何让 requestImages() 函数仅在 performTagRequest() 函数完成后调用,然后才设置详细信息项?
我只是想避免在较大的调用上出现竞争。
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)")
})
}
看来您需要一个完成处理程序。
将 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)
})
如果你想在它后面添加其他参数。
我有以下代码,它请求一些 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
如何让 requestImages() 函数仅在 performTagRequest() 函数完成后调用,然后才设置详细信息项?
我只是想避免在较大的调用上出现竞争。
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)")
})
}
看来您需要一个完成处理程序。 将 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)
})
如果你想在它后面添加其他参数。