2013-10-17 2 views
11

NSURLSession과 함께 AFNetworking 2.0을 사용하려고합니다. 나는이 방법을 사용하고있다AFNetworking 2.0에서 Progress 매개 변수를 사용하는 방법

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request 
             fromFile:(NSURL *)fileURL 
             progress:(NSProgress * __autoreleasing *)progress 
           completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler; 

나는 어떻게 진도 매개 변수를 사용해야 하는가. 이 방법은 비 차단 방법입니다. 따라서 업데이트를 받으려면 'progress'의 말을 들어야합니다. 그러나 매개 변수는 속성을 가지지 않습니다. 로컬 변수 만 가져옵니다 (NSProgress * __autoreleasing *). 로컬 var에 KVO를 추가 할 수 없습니다.

사용 방법은 잘 모르겠습니다.

답변

23

언제든지 인수가 **으로 주어지면 평소처럼 실제 개체에 대한 포인터가 아닌 기존 개체에 대한 포인터를 포인터로 전달해야한다는 것을 의미합니다.

이 경우 NSProgress 개체에 대한 포인터에 대한 포인터를 전달한 다음 해당 개체의 변경 내용을 관찰하여 업데이트를 가져옵니다.

예 :

// Create a progress object and pass it in 
NSProgress *progress; 
[sessionManager uploadTaskWithRequest:request fromFile:fileURL progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { 
    // Completion code 
}]; 

// Observe fractionCompleted using KVO 
[progress addObserver:self 
      forKeyPath:@"fractionCompleted" 
      options:NSKeyValueObservingOptionNew 
      context:NULL]; 

이 그 다음이보고됩니다 :

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 

    if ([keyPath isEqualToString:@"fractionCompleted"] && [object isKindOfClass:[NSProgress class]]) { 
     NSProgress *progress = (NSProgress *)object; 
     NSLog(@"Progress is %f", progress.fractionCompleted); 
    } 
} 
+1

nitpicky이기 때문에 그것은 * * 포인터에 대한 포인터 * 대신 * 포인터입니다. 실제 오브젝트는 힙에 있습니다. +1 올바른 대답을 위해 :) –

+0

@ GabrielePetronella 좋은 잡기, 고마워요 :) – iwasrobbed

+1

당신은 오신 것을 환영합니다. 나는 약간의 단어를 추가하는 자유를 취했다 :) –