我如何检查我的Facebook iOS上传的进度?

我正在使用Facebook iOS SDK并使用Graph API将video上传到Facebook。

上传工作正常,但我可以跟踪上传的进度,所以我可以在进度条上反映进度。

这是一个古老的问题,但你想要做的是最新的Facebook iOS SDK v3.9。 (2013年10月27日)

本质上,FBRequestConnection公开了一个属性urlRequest(NSMutableURLRequest),你可以使用它来发送任何其他第三方networking框架或苹果提供的数据。

https://developers.facebook.com/docs/reference/ios/current/class/FBRequestConnection#urlRequest

下面是使用AFNetworking 1.x获取进度callback的一个例子。

准备请求正文

NSDictionary *parameters = @{ @"video.mov": videoData, @"title": @"Upload Title", @"description": @"Upload Description" }; 

创buildFBRequest

 FBRequest *request = [FBRequest requestWithGraphPath:@"me/videos" parameters:parameters HTTPMethod:@"POST"]; 

生成FBRequestConnection(取消并提取URLRequest)

 FBRequestConnection *requestConnection = [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { }]; [requestConnection cancel]; NSMutableURLRequest *urlRequest = requestConnection.urlRequest; 

使用AFNetworking HTTPRequestOperation

 AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:urlRequest]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { // Do your success callback. } failure:^(AFHTTPRequestOperation *operation, NSError *error) { // Do your failure callback. }]; 

设置进度callback

 [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite); }]; 

开始操作

 [[APIClient sharedInstance] enqueueHTTPRequestOperation:operation]; // APIClient is a singleton class for AFHTTPClient subclass 

我终于在NSURLConnection中find了一个这样做的方法。 这意味着在FBRequest.h和FBRequest.m文件中添加下面的代码来创build一个新的委托。

在FBRequest.m文件的底部有NSURLConnectionDelegate的所有方法。 在此添加此代码:

 - (void)connection:connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite { float percentComplete = ((float)totalBytesWritten/(float)totalBytesExpectedToWrite); if ([_delegate respondsToSelector:@selector(request:uploadPercentComplete:)]) { [_delegate request:self uploadPercentComplete:percentComplete]; } } 

现在把这个放在FBRequest.h类中来创build一个新的FBRequest委托:

 /** * Called a data packet is sent * * The result object is a float of the percent of data sent */ - (void)request:(FBRequest *)request uploadPercentComplete:(float)per; 

这在FBRequest.h文件的底部:

 @protocol FBRequestDelegate <NSObject> @optional 

现在你所要做的就是在你的代码中任何地方调用这个新的委托,就像其他的FBRequest委托一样,它会给你一个从0.0到1.0的浮点数(0%到100%)。

奇怪的是,Facebook的API没有这个(随着上传取消,我发现这里如何做到这一点, 如何取消正在使用Facebook iOS SDK的video上传? ),因为它不那么棘手。

请享用!