2014-09-24 21 views
5

Używam AFNetworking do przesyłania plików wideo na serwer i wysyłam limit czasu przesyłania prawie za każdym razem, gdy próbuję przesłać pliki.Limit czasu NSURLSessionUploadTask na zewnątrz

Próbuję przesłać wiele plików w tym samym czasie, do tej pory max próbowałem to 2, ponieważ mają limit czasu.

odpowiedni kod:

 for i in 0 ... 2 { 
      let filePath : NSURL = NSURL(fileURLWithPath: "filepathgoeshere") 

      let tempFilename = String(format: "%f", NSDate.timeIntervalSinceReferenceDate()) 
      let tempFileUrl = NSURL(fileURLWithPath: "\(NSTemporaryDirectory())\(tempFilename)") 

      let request = AFHTTPRequestSerializer().multipartFormRequestWithMethod("POST", URLString: getAPIURL(), parameters: parameters, constructingBodyWithBlock: { (formData : AFMultipartFormData!) -> Void in 
       formData.appendPartWithFileURL(filePath, name: "file", fileName: "file", mimeType: "video/mp4", error: nil) 
       }, error: nil) 

      // Work around for problem with multi-part requests not giving a content-length and being rejected by S3 
      // See: https://github.com/AFNetworking/AFNetworking/issues/1398 
      AFHTTPRequestSerializer().requestWithMultipartFormRequest(request, writingStreamContentsToFile: tempFileUrl, completionHandler: { (error: NSError!) -> Void in 
       var manager : AFURLSessionManager = AFURLSessionManager(sessionConfiguration: NSURLSessionConfiguration.defaultSessionConfiguration()) 

       var progress : NSProgress? = nil 

       var uploadTask : NSURLSessionUploadTask = manager.uploadTaskWithRequest(request, fromFile: tempFileUrl, progress: &progress, completionHandler: { (response: NSURLResponse!, responseObject: AnyObject!, error: NSError!) -> Void in 
        NSFileManager.defaultManager().removeItemAtURL(tempFileUrl, error: nil) 
        if let err = error { 
         println("There was an error :(") 
         println("Error: \(err.localizedDescription)") 
         // TODO: Add in relevant error catching 
         successCallback(success: false) 
        } else { 
         successCallback(success: true) 
        } 
       }) 

       if let testNil = progress { 
        progressCallback(progress: progress) 
       } 

       uploadTask.resume() 
      }) 
     } 

Odpowiedz

1
func multipleFileUploadRequestSessionManager(url:String,parameters:NSDictionary,fileInfo:NSArray,completionHandler: (response:NSURLResponse?,responseObject:AnyObject?,error:NSError?) ->()) 
    { 
     let request : NSMutableURLRequest = AFHTTPRequestSerializer().multipartFormRequestWithMethod("POST", URLString: url, parameters: parameters, constructingBodyWithBlock: { (formData) -> Void in 

      if(fileInfo.count > 0) 
      { 
       for file in fileInfo 
       { 
        var fileData = file.valueForKey("fileData") as NSData 
        var name  = file.valueForKey("filenameData") as String 
        var fileName = file.valueForKey("fileName") as String 
        var mimeType = file.valueForKey("mimeType") as String 

        formData.appendPartWithFileData(fileData, name: name, fileName: fileName, mimeType: mimeType) 
       } 
      } 


     }, error: nil) 

     let conf : NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration() 

     let manager : AFURLSessionManager = AFURLSessionManager(sessionConfiguration: conf) 

     var progress : NSProgress? = nil 

     var uploadTask:NSURLSessionUploadTask = manager.uploadTaskWithStreamedRequest(request, progress: nil) { (response, responseObject, error) -> Void in 
      completionHandler(response:response,responseObject:responseObject,error:error) 

     } 

     uploadTask.resume() 
} 

To może pomóc do wielokrotnego przesyłania plików