2013-10-17 5 views
11

Ich versuche AFNetworking 2.0 mit NSURLSession zu verwenden. Ich verwende die MethodeSo verwenden Sie den Progress-Parameter in AFNetworking 2.0

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

Wie soll ich den Fortschrittsparameter verwenden. Die Methode ist eine nicht blockierende Methode. Daher muss ich mir die 'progress' anhören, um die Updates zu erhalten. Aber der Parameter würde keine Eigenschaft annehmen. Nimmt nur eine lokale Variable an (NSProgress * __autoreleasing *). Ich kann KVO nicht zu einer lokalen Var hinzufügen.

Ich bin nicht wirklich sicher, wie man verwendet.

Antwort

23

Jedes Mal, wenn ein Argument als ** angegeben wird, bedeutet dies, dass Sie den Zeiger auf den Zeiger auf ein vorhandenes Objekt, nicht einen Zeiger auf das eigentliche Objekt übergeben sollen, wie Sie normalerweise tun würden.

In diesem Fall übergeben Sie einen Zeiger auf einen Zeiger auf ein NSProgress Objekt und beobachten dann die Änderungen in diesem Objekt, um die Updates zu erhalten.

Beispiel:

// 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]; 

Dann wird es in berichtet:

- (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 Als es ist * ein Zeiger auf den Zeiger * anstatt a * Zeiger *. Das eigentliche Objekt lebt auf dem Heap. +1 für die richtige Antwort :) –

+0

@GabrielePetronella Guter Fang, danke :) – iwasrobbed

+1

Gern geschehen. Ich habe mir die Freiheit genommen ein paar Worte hinzuzufügen :) –

Verwandte Themen