我如何检查我的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上传? ),因为它不那么棘手。
请享用!