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

Posted

技术标签:

【中文标题】NSURLConnection(作为 AFNetworking 的一部分)不调用 NSURLConnectionDataDelegate 委托【英文标题】:NSURLConnection (as part of AFNetworking) doesn't call NSURLConnectionDataDelegate delegate 【发布时间】:2013-02-12 16:20:03 【问题描述】:

问题

我正在使用AFNetworking,它会生成一个NSURLConnection 对象来上传照片。

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 应该在什么情况下? (它似乎没有很好的记录。)

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

您能否准确告诉我们是什么第三方库导致了您的问题,以便我们避免它并调查它正在做什么以尝试回答您的故障排除步骤问题? @0xced 我不能说图书馆是什么,因为它还没有向公众开放。是覆盖这样的委托方法以将其实现为类别的唯一方法吗?如果不是,还有哪些其他方法?我如何确定其他班级是否正在这样做? @AaronBrager 分类可以invoke the supersequent implementation的原方法。【参考方案2】:

该库可能在​​NSObject 的类别中实现connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite: 方法。那会很讨厌,但这可以解释为什么不调用AFURLConnectionOperation 的方法。

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

【讨论】:

class-dump --arch armv7 MyFile 说“文件不包含指定的体系结构 (armv7)。可用的体系结构是 armv7、armv7s、i386。”但运行file MyFile 表示armv7、i386 和“cputype (12) cpusubtype (11)”。 不幸的是,错误消息具有误导性(它在我的 TODO 列表中进行修复)。您必须在 application 二进制文件上运行 class-dump,而不是在 library 二进制文件上运行。

以上是关于NSURLConnection(作为 AFNetworking 的一部分)不调用 NSURLConnectionDataDelegate 委托的主要内容,如果未能解决你的问题,请参考以下文章

在 NSURLConnection 中的 Swift 中从 completionHandler 中获取数据

iOS UIWebView 在 NSURLConnection 之后不加载 url

iOS开发 GETPOST请求方法:NSURLConnection篇

Xcode 7.3:NSURLSession/NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9802)

iOS 7系列译文:忘记NSURLConnection,拥抱NSURLSession吧!

iOS开发 GET、POST请求方法(NSURLConnection篇)