我有一个异步请求的递归函数。如果请求成功,我想保存在数组中,但是我不知道如何。具体来说,它是一个上载文件的功能,如果该功能获得一个文件夹,则该文件夹内的文件也应该上载。
我考虑过用完成处理程序来实现这一点,这是关于以下内容的:
func uploadFiles(pathToFile: NSURL) ->[Bool]{
var suc: [Bool] = [Bool]()
self.uploadFileRec(pathToFile, suc: &suc){
(result: [Bool]) in
println(result)
}
return suc
}
func uploadFilesRec(pathToFile: NSURL, inout suc: [Bool], completionHandler: (result: [Bool]) -> Void){
var isDir: ObjCBool = ObjCBool(true)
var manager: NSFileManager = NSFileManager.defaultManager()
manager.fileExistsAtPath(pathToFile.path!, isDirectory: &isDir)
if(isDir){
var error: NSError? = nil
let contents = manager.contentsOfDirectoryAtPath(pathToFile.path!, error: &error) as! [String]
for fileName in contents {
if(fileName != ".DS_Store"){
var pathString = pathToFile.path! + "/" + fileName
var updatePathtoFile = NSURL(fileURLWithPath: pathString)
self.uploadFilesRec(updatePathtoFile!, suc: &suc, completionHandler: completionHandler)
completionHandler(result: suc)
}
}
}
else{
asyncFileUpload(...){
...
suc.append(/*successful or not*/)
}
}
}
但是问题在于,println不仅被调用一次,而且在内部被调用的文件多达uploadFileRec。因此,如果我要调用另一个函数而不是println,则该函数也将被多次调用。所以我认为completionHandler的想法是错误的。我还能怎么实现呢?
好吧,我回答我自己的问题。
使用complitionHandler的想法确实是错误的。就像我在问题中所说的那样,complitionHandler的调用次数与递归函数的调用次数相同。如果您想收集响应或喜欢在我的应用程序中收集是否成功上传了一些文件,则必须使用调度组。主要思想是将所有请求添加到该组中,然后等待所有操作完成。
实际上,这意味着创建组:
let group = dispatch_group_create()
在调用递归函数之前,然后每次函数调用自身时,请输入组:
dispatch_group_enter(self.group)
请求完成后离开组,进入组的时间与离开组的时间相同:
dispatch_group_leave(self.group)
等待所有工作完成:
dispatch_group_notify(group, dispatch_get_main_queue()) {
//Do work here
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句