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

时间:2011-10-29 10:54:20

标签: iphone ios facebook-graph-api

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

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

2 个答案:

答案 0 :(得分:5)

这是一个古老的问题,但您可以尝试使用最新的Facebook iOS SDK v3.9。 (2013年10月27日)

基本上,FBRequestConnection公开了一个属性urlRequest(NSMutableURLRequest),您可以使用该属性将任何其他第三方网络框架甚至Apple提供的数据发送出去。

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

以下是使用AFNetworking 1.x获取进度回调的示例。

准备申请正文

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

创建FBRequest

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.
}];

设置进度回调

[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

答案 1 :(得分:0)

在NSURLConnection环顾四周之后,我终于找到了这样做的方法。这意味着在FBRequest.h和FBRequest.m文件中添加以下代码以创建新的委托。

在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类中以创建一个新的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没有这个(以及上传取消,我发现如何在这里做How to cancel a video upload in progress using the Facebook iOS SDK?),因为它并不是那么棘手。

享受!