0

非同期リクエストを使用した再帰関数があります。リクエストが成功した場合に配列に保存したいのですが、方法がわかりません。具体的には、ファイルをアップロードする機能であり、この機能がフォルダーを取得する場合、このフォルダー内のファイルもアップロードする必要があります。

私はこれについての何か、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 の考え方は間違っていたと思います。他にどうすればこれを実現できますか?

4

2 に答える 2

0
  1. var isDir: ObjCBool = ObjCBool(true)そのため、デフォルトですべてのファイルをディレクトリとして扱い、失敗するとisDirectoryフラグが TRUE のままmanager.fileExistsAtPathであるため、深い再帰が発生します。

    パスが存在しない場合、この値は戻り時に未定義です

    アップルドキュメントから...

  2. var pathString = pathToFile.path! + "/" + fileName-最終的に正しいパスを取得しているかどうかわかりません。だから、あなたは再帰を得ます。あなたのpathStringを確認してください

  3. manager.fileExistsAtPathの結果は無視されるため、ブラインド アップロードを行っています...

それを修正して、続けてください...

于 2015-09-15T10:28:11.810 に答える