2015-01-20 6 views
4

Я пытаюсь использовать NSProgress с AFNetworking, это код, я используюuploadTask с прогрессом, используя AFNetworking в Swift

//func upload... 
//... 
let request: NSMutableURLRequest = AFHTTPRequestSerializer().multipartFormRequestWithMethod("POST", URLString: url, parameters: s3parameters, constructingBodyWithBlock: { formData in 
     let data: AFMultipartFormData = formData 
     data.appendPartWithFileURL(fileURL, name: "file", error: nil) 
    }, error: nil) 
    request.setValue("application/json", forHTTPHeaderField: "Accept") 

    let sessionManager: AFURLSessionManager = AFURLSessionManager(sessionConfiguration: NSURLSessionConfiguration.defaultSessionConfiguration()) 
    var progress: NSProgress? 

    let uploadTask: NSURLSessionUploadTask = sessionManager.uploadTaskWithStreamedRequest(request, progress: &progress, completionHandler: { (response, responseObject, error) in 
    //... 
    }) 

    uploadTask.resume() 
    progress?.addObserver(self, forKeyPath: "fractionCompleted", options: NSKeyValueObservingOptions.Initial, context: nil) 
//... 

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { 
    let progress: NSProgress = object as NSProgress 
    println("progress: \(progress.fractionCompleted)") 
} 

Файл загружается правильно, но это не так - я только получение значения прогресса напечатанный один раз («прогресс: 0.0»), а затем я заканчивая EXC_BAD_ACCESS внутри AFURLSessionManager.m:

#pragma mark - NSURLSessionTaskDelegate 

- (void)URLSession:(__unused NSURLSession *)session 
      task:(__unused NSURLSessionTask *)task 
didSendBodyData:(__unused int64_t)bytesSent 
totalBytesSent:(int64_t)totalBytesSent 
totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend 
{ 
    self.progress.totalUnitCount = totalBytesExpectedToSend; <<< EXC_BAD_ACCESS 
    self.progress.completedUnitCount = totalBytesSent; 
} 

Что я делаю неправильно? Должен ли я установить «прогресс var: NSProgress»? по-другому или есть что-то еще, что мне не хватает?

ответ

1

О, я установил ее - мне нужно, чтобы удалить наблюдателя от прогресса:

let uploadTask: NSURLSessionUploadTask = sessionManager.uploadTaskWithStreamedRequest(request, progress: &progress, completionHandler: { (response, responseObject, error) in 
//... 
progress?.removeObserver(self, forKeyPath: "fractionCompleted", context: nil) // added this line 
//... 
})