9

在使用UIImageView+AFNetworking类别和AFNetworking 3.0时,有没有人有一个很好的工作解决方案来获取下载进度。

这个类别,我在 3.0 之前的版本中使用过,现在已经停止工作。

这是我自己的实验版本,可悲的是,目前它随机崩溃。

4

3 回答 3

2

这是 AFNetworking 3.0 的修改版本,您可以在其中使用UIImageView+AFNetworking类别从服务器加载图像时显示进度。

https://github.com/rushisangani/AFNetworking

请将以下文件替换为原始 AFNetworking 文件。

UIImageView+AFNetworking.h,
UIImageView+AFNetworking.m,

UIImage+ImageDownloader.h,
UIImage+ImageDownloader.m

注意:如果您更新您的 pod,那么这将被删除。

于 2016-01-23T21:37:25.430 回答
1

您可以通过在UIImageView+AFNetworking.h中添加几行来实现这一点

  1. 将此代码放在导入语句下的文件顶部

    static void * AFTaskCountOfBytesReceivedContext = &AFTaskCountOfBytesReceivedContext;
    
  2. 并且您需要注册观察者以通过setImageWithURLRequest在该位置的函数下添加以下行来跟踪接收到的字节

    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. 最后添加这个新功能。

    #pragma mark - NSKeyValueObserving
    
    - (void)observeValueForKeyPath:(NSString *)keyPath
                          ofObject:(id)object
                            change:(__unused NSDictionary *)change
                           context:(void *)context
    {
        if (context == AFTaskCountOfBytesReceivedContext) {
    
            if ([keyPath isEqualToString:NSStringFromSelector(@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 isEqualToString:NSStringFromSelector(@selector(state))]) {
                if ([(NSURLSessionTask *)object state] == NSURLSessionTaskStateCompleted) {
                    @try {
                        [object removeObserver:self forKeyPath:NSStringFromSelector(@selector(state))];
                        NSLog(@"Image Download Complete");
                        if (context == AFTaskCountOfBytesReceivedContext) {
                            [object removeObserver:self forKeyPath:NSStringFromSelector(@selector(countOfBytesReceived))];
                        }
                    }
                    @catch (NSException * __unused exception) {}
                }
            }
        }
    }
    
于 2016-05-02T13:44:40.137 回答
1

如果您查看 AFImageDownloader 这个,它被 UIImageView 类别用来下载图像。在这堂课你

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

它返回具有 NSURLSessionDataTask *task 属性的收据。NSURLSessionDataTask 具有不同的字节下载方式、预期字节接收等属性。也许你可以使用它来完成你的任务。

于 2016-01-19T07:15:34.463 回答