2013-10-17 7 views
11

Sto tentando di utilizzare AFNetworking 2.0 con NSURLSession. Sto usando il metodoCome utilizzare il parametro Progress in AFNetworking 2.0

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

Come dovrei usare il parametro di avanzamento. Il metodo è un metodo non bloccante. Quindi dovrò ascoltare lo 'progress' per ottenere gli aggiornamenti. Ma il parametro non prenderebbe una proprietà. Accetta solo una variabile locale (NSProgress * __autoreleasing *). Non riesco ad aggiungere KVO a una var locale.

Non sono proprio sicuro di come utilizzarlo.

risposta

23

Ogni volta che viene indicato un argomento come ** significa che si deve passare il puntatore al puntatore a un oggetto esistente, non un puntatore all'oggetto reale come si farebbe normalmente.

In questo caso, si passa un puntatore a un puntatore a un oggetto NSProgress e si osservano le modifiche in quell'oggetto per ottenere gli aggiornamenti.

Esempio:

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

poi diventa presentate nel:

- (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

Essere pignoli è * un puntatore al puntatore * invece di un puntatore * *. L'oggetto reale vive sul mucchio. +1 per la risposta corretta però :) –

+0

@GabrielePetronella Buona cattura, grazie :) – iwasrobbed

+1

Siete i benvenuti. Mi sono permesso di aggiungere alcune parole :) –