带有异步请求的递归函数

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

    manager.fileExistsAtPath 结果被忽略了,所以,你正在盲目上传...

解决问题并继续前进...

【讨论】:

好的,谢谢。尤其是你的口渴点。我没有意识到这一点。 你对我的“从递归异步函数获取成功或不数组”的问题有什么想法吗?

以上是关于带有异步请求的递归函数的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中的递归异步函数

将递归异步函数转换为 Promise

C#异步递归函数不能正常工作? [复制]

从递归超时调用异步 mongodb 函数,我想是上下文错误

Discord JS bot 如何从 API 获取递归异步函数

递归函数,带有完成块,检索多个 MKDirections - Swift