2013-02-12 32 views
3

的問題

我使用AFNetworking,其產生NSURLConnection的對象,上傳照片。NSURLConnection的(如AFNetworking的一部分)不調用NSURLConnectionDataDelegate委託

的NSURLConnection的不是撥打任何電話到

- (void)connection:(NSURLConnection __unused *)connection 
    didSendBodyData:(NSInteger)bytesWritten 
totalBytesWritten:(NSInteger)totalBytesWritten 
totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite 

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

該請求是一個帶有照片附件(Content-Disposition「form-data」,MIME類型「image/jpeg」)的HTTP POST請求。這應該(我認爲)隨着上傳的進行而定期調用這個方法。

我需要該方法來向用戶顯示進度條。但是,該方法沒有被調用。

注:

  • 委託設置正確;其他委託方法被稱爲
  • 文件上傳成功

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

該庫可能在​​NSObject的類別中實現了connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:方法。這將是非常討厭的,但這可以解釋爲什麼不調用AFURLConnectionOperation的方法。

爲了檢查這個假設,你可以在編譯後的二進制文件上運行class-dump。在輸出中搜索didSendBodyData:。如果某個類別中有匹配,圖書館顯然負責。該庫也可能與Objective-C運行時相混淆,但這比僅運行類轉儲更難以檢測。

+0

'class-dump --arch armv7 MyFile'說:「文件不包含指定的架構(armv7)。可用的架構是armv7,armv7s,i386。」但運行'file MyFile'指示armv7,i386和「cputype(12)cpusubtype(11)」。 – 2013-02-21 15:53:51

+0

錯誤消息很不幸誤導(它在我的TODO列表上以解決它)。您必須在您的**應用程序**二進制文件上運行類轉儲,而不是**庫** **二進制文件。 – 0xced 2013-02-21 16:04:10

3

第三方錯誤報告庫重寫NSURLConnection上的委託方法。刪除庫解決了問題。 (AFNetworking或NSURLConnection沒有任何問題。)

如果您可以提供疑難解答步驟,以更快地隔離此問題,我會獎勵您的賞金。 (請注意,第三方庫已編譯,因此源代碼搜索不起作用。)

+0

請問您能否確切地告訴我們第三方庫是什麼導致您的問題,以便我們可以避免它,並調查它正在做什麼來嘗試回答您的疑難解答步驟問題? – 0xced 2013-02-21 06:24:36

+0

@ 0xced我不能說圖書館是什麼,因爲它尚未向公衆開放。是否重寫委託方法的唯一方法就是將其實現爲一個類別?如果不是,其他方式是什麼?我怎麼能確定是否有其他班正在這樣做? – 2013-02-21 13:37:36

+1

@AaronBrager類別可以[調用原始方法的超常實現](http://www.cocoawithlove.com/2008/03/supersequent-implementation.html)。 – mattt 2013-04-05 09:13:38

相關問題