Vayn
Vayn

Reputation: 2717

How to get download progress with AFHTTPSessionManager in AFNetworking 3.0

When I use AFNetworking 2, I could get progress with AFHTTPRequestOperation like this:

NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:aURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:_timeoutInterval];
AFHTTPRequestOperation *imageRequestOperation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest];
imageRequestOperation.responseSerializer = [AFImageResponseSerializer serializer];

__weak AFHTTPRequestOperation *imageRequestOperationForBlock = imageRequestOperation;

[imageRequestOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    // ...
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // ...
}];

[imageRequestOperation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
    if (progress) {
        progress((float)totalBytesRead / totalBytesExpectedToRead);
    }
}];

I use AFHTTPSessionManager GET:parameters:success:failure: to get data, but I don't know how to get download progress in AFNetworking 3.0.

Upvotes: 4

Views: 3345

Answers (1)

Rok Jarc
Rok Jarc

Reputation: 18865

Link in comments was missleading (NSURLSessionDownloadTask). Sorry about that.

Code below should work though.

Assumption: this code is placed in AFHTTPSessionManager subclass with an NSURLSessionDataTask *testTask ivar declared. It should be easy enough modify as needed.

Vital part of code taken from this answer

- (void)test
{
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://eoimages.gsfc.nasa.gov/images/imagerecords/78000/78797/nwpassage_tmo_2012199_lrg.jpg"]];

    testTask = [self dataTaskWithRequest:request
                       completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {

                           if (error)
                           {
                               //...
                               NSLog(@"error");
                           }
                           else
                           {
                               //...

                               UIImage *result = responseObject;

                               NSLog(@"Success: %@",NSStringFromCGSize(result.size));
                           }
                       }];

    [self setDataTaskDidReceiveDataBlock:^(NSURLSession *session,
                                                      NSURLSessionDataTask *dataTask,
                                                      NSData *data)
     {
         if (dataTask.countOfBytesExpectedToReceive == NSURLSessionTransferSizeUnknown)
           return;

         if (dataTask != testTask)
           return;

         NSUInteger code = [(NSHTTPURLResponse *)dataTask.response statusCode];

         if (!(code> 199 && code < 400))
           return;

         long long  bytesReceived = [dataTask countOfBytesReceived];
         long long  bytesTotal = [dataTask countOfBytesExpectedToReceive];

         NSLog(@"... %lld/%lld",
               bytesReceived,
               bytesTotal);
     }];

    [testTask resume];
}

Upvotes: 4

Related Questions