非同期リクエストを使用した再帰関数があります。リクエストが成功した場合に配列に保存したいのですが、方法がわかりません。具体的には、ファイルをアップロードする機能であり、この機能がフォルダーを取得する場合、このフォルダー内のファイルもアップロードする必要があります。
私はこれについての何か、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 呼び出しが 1 回だけでなく、uploadFileRec と同じ回数呼び出されることです。したがって、println の代わりに別の関数を呼び出すと、その関数も何度も呼び出されます。したがって、completionHandler の考え方は間違っていたと思います。他にどうすればこれを実現できますか?