NSURLConnection(作为AFNetworking的一部分)不会调用NSURLConnectionDataDelegate委托

时间:2013-02-12 16:20:03

标签: ios objective-c nsurlconnection afnetworking

问题

我正在使用生成NSURLConnection对象的AFNetworking来上传照片。

NSURLConnection没有对

进行任何调用
- (void)connection:(NSURLConnection __unused *)connection
   didSendBodyData:(NSInteger)bytesWritten
 totalBytesWritten:(NSInteger)totalBytesWritten
totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite

方法。 (它是NSURLConnectionDataDelegate protocol的一部分,在NSURLConnection.h中定义)

请求是带有照片附件的HTTP POST请求(Content-Disposition“form-data”,Mime类型“image / jpeg”)。这应该(我认为)导致在上传过程中定期调用此方法。

我需要该方法向用户显示进度条。但是,该方法不会被调用。

注意:

  • 代表设置正确;其他委托方法称为
  • 文件上传成功

AFNetworking代码

我很确定这是一个NSURLConnection问题,而不是AFNetworking问题。

但为了以防万一,这里是我AFHTTPClient子类的相关代码:

NSMutableURLRequest *request = [self multipartFormRequestWithMethod:@"POST" path:path parameters:parameters constructingBodyWithBlock:constructor];
AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure];

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

[self enqueueHTTPRequestOperation:operation];

我的AFHTTPClient子类不会覆盖我调用的任何方法:

  • multipartFormRequestWithMethod: path: parameters: constructingBodyWithBlock:
  • HTTPRequestOperationWithRequest: success: failure:
  • setUploadProgressBlock:
  • enqueueHTTPRequestOperation:

constructor(void (^)(id<AFMultipartFormData>))类型的块,不是nil(通过单步执行代码验证)。

当我在调试器中输入po operation.uploadProgress时,我看到$0 = 0x1301d9f0 <__NSMallocBlock__: 0x1301d9f0>所以我认为该块正确设置。

文件总是上传成功,但上传进度块中的代码未运行,因此我的进度条永远不会更新。

问题

为什么NSURLConnection不调用此方法?

NSURLConnection应该是什么情况? (它似乎没有详细记录。)

最重要的是,如何向用户显示上传进度?

2 个答案:

答案 0 :(得分:3)

第三方错误报告库覆盖了NSURLConnection上的委托方法。删除库解决了该问题。 (AFNetworking或NSURLConnection都没有问题。)

如果您可以提供可以更快地解决此问题的问题排查步骤,我将奖励您。 (请记住,第三方库已编译,因此源代码搜索无效。)

答案 1 :(得分:1)

库可能在connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:的类别中实现NSObject方法。这将是非常讨厌的,但这可以解释为什么AFURLConnectionOperation的方法没有被调用。

为了检查这个假设,您可以在已编译的二进制文件上运行class-dump。在输出中搜索didSendBodyData:。如果某个类别中存在匹配项,则图书馆显然负有责任。该库也可能会弄乱Objective-C运行时,但这比仅运行类转储更难检测。