AFNetworking 3.0 Progression du téléchargement de setImageWithURLRequest

Quelqu'un at-il une bonne solution de travail pour faire progresser le téléchargement lorsque vous utilisez la catégorie UIImageView + AFNetworking et AFNetworking 3.0 .

Cette catégorie , que j'ai utilisée pour les versions jusqu'à 3.0 a cessé de fonctionner maintenant.

Voici ma propre version expérimentale qui malheureusement, pour l'instant, se bloque randomment.

Voici la version modifiée de AFNetworking 3.0 dans laquelle vous pouvez afficher une progression lors du chargement de l'image du server à l'aide de la catégorie UIImageView + AFNetworking .

https://github.com/rushisangani/AFNetworking

Veuillez replace les files suivants par des files AFNetworking originaux.

UIImageView+AFNetworking.h, UIImageView+AFNetworking.m, UIImage+ImageDownloader.h, UIImage+ImageDownloader.m 

REMARQUE: Si vous mettez à jour votre pod, celui-ci sera supprimé.

Si vous regardez AFImageDownloader cela, il est utilisé par la catégorie UIImageView pour download des images. Dans cette class vous

 - (nullable AFImageDownloadReceipt *)downloadImageForURLRequest: (NSURLRequest *)request success:(nullable void (^)(NSURLRequest *request, NSHTTPURLResponse * _Nullable response, UIImage *responseObject))success failure:(nullable void (^)(NSURLRequest *request, NSHTTPURLResponse * _Nullable response, NSError *error))failure; 

Il renvoie un accusé de réception qui a une propriété de tâche NSURLSessionDataTask *. NSURLSessionDataTask a différentes propriétés du téléchargement des octets, des octets attendus à recevoir, etc. Vous pouvez peut-être l'utiliser et réaliser votre tâche.

Vous pouvez y parvenir en ajoutant quelques lignes dans UIImageView + AFNetworking.h

  1. Placez ce code en haut du file sous la déclaration d'import

     static void * AFTaskCountOfBytesReceivedContext = &AFTaskCountOfBytesReceivedContext; 
  2. Et vous devez save l'observateur pour suivre les octets reçus en ajoutant la ligne ci-dessous sous la fonction setImageWithURLRequest à la position

     if (cachedImage) { // AFNetworking default code } else{ // AFNetworking default code // Our new lines to track the download [self.af_activeImageDownloadReceipt.task addObserver:self forKeyPath:@"state" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesReceivedContext]; [self.af_activeImageDownloadReceipt.task addObserver:self forKeyPath:@"countOfBytesReceived" options:(NSKeyValueObservingOptions)0 context:AFTaskCountOfBytesReceivedContext]; } 
  3. Ajoutez cette nouvelle fonction à la fin.

     #pragma mark - NSKeyValueObserving - (void)observeValueForKeyPath:(NSSsortingng *)keyPath ofObject:(id)object change:(__unused NSDictionary *)change context:(void *)context { if (context == AFTaskCountOfBytesReceivedContext) { if ([keyPath isEqualToSsortingng:NSSsortingngFromSelector(@selector(countOfBytesReceived))]) { if ([object countOfBytesExpectedToReceive] > 0) { dispatch_async(dispatch_get_main_queue(), ^{ //You can do your stuff at here like show progress NSLog(@"Progress : %f",[object countOfBytesReceived] / ([object countOfBytesExpectedToReceive] * 1.0f)); }); } } if ([keyPath isEqualToSsortingng:NSSsortingngFromSelector(@selector(state))]) { if ([(NSURLSessionTask *)object state] == NSURLSessionTaskStateCompleted) { @try { [object removeObserver:self forKeyPath:NSSsortingngFromSelector(@selector(state))]; NSLog(@"Image Download Complete"); if (context == AFTaskCountOfBytesReceivedContext) { [object removeObserver:self forKeyPath:NSSsortingngFromSelector(@selector(countOfBytesReceived))]; } } @catch (NSException * __unused exception) {} } } } }