具有异步请求的递归函数
我有一个具有异步请求的递归函数。如果请求成功,我想保存在一个数组中,但我不知道如何。 具体它是一个上传文件的功能,如果该功能得到的文件夹比该文件夹内的文件还要上传。具有异步请求的递归函数
我想过用completionHandler,一些有关这个工具的:
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)
而等待unti l所有工作已完成:
dispatch_group_notify(group, dispatch_get_main_queue()) {
//Do work here
}
-
var isDir: ObjCBool = ObjCBool(true)
所以,你把所有的文件默认显示目录,当manager.fileExistsAtPath
失败,你深深的递归因为isDirectory标志保持真实:如果路径不存在,这个值在返回
苹果文档是不明确的...
var pathString = pathToFile.path! + "/" + fileName
- 不确定你最终得到了正确的路径。所以,你得到递归。检查pathString- manager.fileExistsAtPath结果被忽略,所以,你在做盲人上传...
解决这个事情,坚持下去......
好的谢谢。特别是你的渴望点。我没有意识到这一点。 – boddAh234
你有一个想法,我的问题与“递归异步函数成功或不是数组”吗? – boddAh234