2015-09-15 40 views
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调用不仅是时间,但多达uploadFileRec进去叫。因此,如果我要调用另一个函数而不是println,该函数也会被调用很多次。 所以我认为用completionHandler这个想法是错误的。我还能怎样才能认识到这一点?

回答

0

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

complitionHandler的想法确实是错误的。就像我在问题中所说的,complitionHandler被调用的次数与递归函数的调用次数相同。如果您希望在应用程序中收集回复或类似信息,如果某些文件的上载成功,您必须使用派送组。主要想法是在该组中添加所有请求,并等待所有请求都完成。

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

let group = dispatch_group_create() 

输入组调用递归函数,然后之前每次函数调用自身:

dispatch_group_enter(self.group) 

离开该组当请求完成和尽可能多的时间,你进入组:

dispatch_group_leave(self.group) 

而等待unti l所有工作已完成:

dispatch_group_notify(group, dispatch_get_main_queue()) { 
     //Do work here 
    } 
0
  1. var isDir: ObjCBool = ObjCBool(true)所以,你把所有的文件默认显示目录,当manager.fileExistsAtPath失败,你深深的递归因为isDirectory标志保持真实:

    如果路径不存在,这个值在返回

    苹果文档是不明确的...

  2. var pathString = pathToFile.path! + "/" + fileName - 不确定你最终得到了正确的路径。所以,你得到递归。检查pathString

  3. manager.fileExistsAtPath结果被忽略,所以,你在做盲人上传...

解决这个事情,坚持下去......

+0

好的谢谢。特别是你的渴望点。我没有意识到这一点。 – boddAh234

+0

你有一个想法,我的问题与“递归异步函数成功或不是数组”吗? – boddAh234