2014-02-22 56 views
7


如何获取AFHTTPRequest的进度?我试过在网上搜索。
我使用:AFNetworking 2.0 HTTP POST进度

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    NSDictionary *params = @{@"gameId" : datas[0], @"p1": datas[1], @"p2":datas[2], @"turn":datas[3] }; 
    manager.requestSerializer = [AFHTTPRequestSerializer serializer]; 
    manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 
    [manager POST:@"http://localhost/thepath/isprivate/thefile.php" 
     parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) { 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    }]; 

有没有想,一个属性或方法我可以用它来访问的AFNetworking 2.0 HTTP POST的进展如何?

+2

嗨,你可以检查这个答案http://stackoverflow.com/a/20543730/1228669 – prasad

回答

1

您可以使用下面的方法

- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request 
             fromData:(NSData *)bodyData 
             progress:(NSProgress * __autoreleasing *)progress 
           completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler 
AFHTTPSessionManager

UPDATE:

通常你会更喜欢使用KVO得到上传的值。因此,像以下应使用:

static void * kDGProgressChanged = &kDGProgressChanged; 

... 

[progress addObserver:self 
      forKeyPath:@"fractionCompleted" 
       options:NSKeyValueObservingOptionNew 
       context:kDGProgressChanged]; 

... 

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(__unused NSDictionary *)change 
         context:(void *)context 
{ 
    if (kDGProgressChanged == context) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self updateProgressInfo]; 
     }); 
    } 
} 
+0

我用这个方法,但不叫进步。虽然我使用KVO进行监控,但上传操作已成功完成,文件已上传但未跟踪进度。怎么了? – lenhhoxung

+0

@lenhhoxung请检查我的更新的答案。 – Avt

19

试试这个:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
NSDictionary *params = @{@"gameId" : datas[0], @"p1": datas[1], @"p2":datas[2], @"turn":datas[3] }; 
manager.requestSerializer = [AFHTTPRequestSerializer serializer]; 
manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:@"http://localhost/thepath/isprivate/thefile.php" parameters:params error:&error]; 

AFHTTPRequestOperation *requestOperation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"operation success: %@\n %@", operation, responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

[requestOperation setUploadProgressBlock:^(NSUInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) { 
    double percentDone = (double)totalBytesWritten/(double)totalBytesExpectedToWrite; 
    NSLog(@"progress updated(percentDone) : %f", percentDone); 
}]; 
[requestOperation start]; 

希望这有助于。

+1

谢谢,但Avt最早回复。 +1给你,但谢谢。 – DHShah01

10

的捷径的方式来实现,这是

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    AFHTTPRequestOperation *requestOperation = [manager POST:@"/service/user/authenticate" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     //Your Business Operation. 
     NSLog(@"operation success: %@\n %@", operation, responseObject); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 
    }]; 
//Here is the upload progress 
[requestOperation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { 
      double percentDone = (double)totalBytesWritten/(double)totalBytesExpectedToWrite; 
      //Upload Progress bar here 
      NSLog(@"progress updated(percentDone) : %f", percentDone); 
     }]; 
+0

看起来您正在设置成功块内的进度块。这真的有用吗?我认为这将是无用的,你基本上设置了成功完成后的进度块。 –

+0

@SterlingChristensen感谢您的通知。该代码已被适当编辑。感谢 –

+0

这是AFN 2.0更短的方式,谢谢 – Kuba