具有异步请求的递归函数

亚历克斯

我有一个异步请求的递归函数。如果请求成功,我想保存在数组中,但是我不知道如何。具体来说,它是一个上载文件的功能,如果该功能获得一个文件夹,则该文件夹内的文件也应该上载。

我考虑过用完成处理程序来实现这一点,这是关于以下内容的:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有异步/等待的递归setTimeout

来自分类Dev

具有异步/等待的递归setTimeout

来自分类Dev

具有异步/等待的递归setTimeout

来自分类Dev

具有异步请求的NodeJS

来自分类Dev

具有异步委托的异步函数的命名约定

来自分类Dev

具有异步网络请求的ReactiveCocoa排序

来自分类Dev

AngularJS:具有异步请求的多个依赖服务

来自分类Dev

具有异步关闭变量的结构函数

来自分类Dev

制作具有异步构造函数的对象数组

来自分类Dev

具有异步函数的 Python 多处理

来自分类Dev

具有异步功能的JavaScript数组

来自分类Dev

具有异步结构的openxml

来自分类Dev

具有异步功能的OracleCommand ExecuteNonQuery

来自分类Dev

具有异步功能的装饰器

来自分类Dev

具有异步功能的意外令牌

来自分类Dev

具有异步方法的RxJava for循环?

来自分类Dev

具有异步任务函数的线程 C#/.NET / await 未编译

来自分类Dev

具有异步QFileSystemModel的Qt异步显示

来自分类Dev

完成所有异步Http请求后执行功能

来自分类Dev

返回带有异步请求的布尔值

来自分类Dev

带有异步动作的useReducer发出API请求

来自分类Dev

完成所有异步Http请求后执行功能

来自分类Dev

具有异步计算的Scala不变性(Akka)

来自分类Dev

具有异步功能的非阻塞I / O

来自分类Dev

具有异步和等待的MVC动作

来自分类Dev

具有异步块的串行调度队列

来自分类Dev

ios快速解析:具有异步结果的方法

来自分类Dev

具有异步操作的std :: function回调

来自分类Dev

订阅具有异步功能的可观察序列