我正在使用生成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”)。这应该(我认为)导致在上传过程中定期调用此方法。
我需要该方法向用户显示进度条。但是,该方法不会被调用。
注意:
我很确定这是一个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应该是什么情况? (它似乎没有详细记录。)
最重要的是,如何向用户显示上传进度?
答案 0 :(得分:3)
第三方错误报告库覆盖了NSURLConnection上的委托方法。删除库解决了该问题。 (AFNetworking或NSURLConnection都没有问题。)
如果您可以提供可以更快地解决此问题的问题排查步骤,我将奖励您。 (请记住,第三方库已编译,因此源代码搜索无效。)
答案 1 :(得分:1)
库可能在connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:
的类别中实现NSObject
方法。这将是非常讨厌的,但这可以解释为什么AFURLConnectionOperation
的方法没有被调用。
为了检查这个假设,您可以在已编译的二进制文件上运行class-dump。在输出中搜索didSendBodyData:
。如果某个类别中存在匹配项,则图书馆显然负有责任。该库也可能会弄乱Objective-C运行时,但这比仅运行类转储更难检测。