gpt4 book ai didi

swift - 带有异步请求的递归函数

转载 作者:行者123 更新时间:2023-11-30 10:11:46 25 4
gpt4 key购买 nike

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

我考虑过用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 get 不仅被调用了一次,而且在内部被调用了与 uploadFileRec 一样多的次数。因此,如果我调用另一个函数而不是 println,该函数也会被调用多次。所以我认为completionHandler的想法是错误的。我还能怎样实现这一点?

最佳答案

好吧,我回答我自己的问题。

complitionHandler 的想法确实是错误的。就像我在问题中所说的那样,commplitionHandler 被调用的次数与调用递归函数的次数一样多。如果您想收集响应或像我的应用程序中收集的内容(如果某些文件上传成功),则必须使用调度组。主要思想是将所有请求添加到该组中并等待所有请求完成。

实际上,这意味着创建组:

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 - 带有异步请求的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32583402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com