带有异步请求的递归函数
Posted
技术标签:
【中文标题】带有异步请求的递归函数【英文标题】:recursive function with async request 【发布时间】:2015-09-15 10:13:13 【问题描述】:我有一个。如果请求成功,我想保存在一个数组中,但我不知道如何。 具体是一个上传文件的函数,如果函数得到一个文件夹,那么这个文件夹里面的文件也应该被上传。
我想过用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 的想法是错误的。我怎么能意识到这一点?
【问题讨论】:
【参考方案1】:好的,我回答我自己的问题。
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
【讨论】:
您可以发布有效的解决方案代码吗?我有类似的问题 不抱歉,我没有代码了。即使我有代码,同时 Swift 也有重大更新,所以它可能已经过时了。但是我觉得dispatch group的想法还是有的,说不定你会找到在线教程【参考方案2】:var isDir: ObjCBool = ObjCBool(true)
因此,默认情况下您将所有文件视为目录,当manager.fileExistsAtPath
失败时,您将获得深度递归,因为 isDirectory 标志保持 TRUE:
如果路径不存在,则返回时该值未定义
来自 Apple 文档...
var pathString = pathToFile.path! + "/" + fileName
- 不确定你最终得到了正确的路径。所以,你得到递归。检查你的 pathString
解决问题并继续前进...
【讨论】:
好的,谢谢。尤其是你的口渴点。我没有意识到这一点。 你对我的“从递归异步函数获取成功或不数组”的问题有什么想法吗?以上是关于带有异步请求的递归函数的主要内容,如果未能解决你的问题,请参考以下文章