2013-04-26 72 views
1

我正在使用sendAsynchronousRequest:queue:completionHandler:上傳一個文件(我已經撕掉了一些舊的第三方庫,以支持使用這個本地方法直接調用我已經離開了NSURLRequest和字典就是這樣)。我無法弄清楚如何說明它是如何完成推送文件的。我認爲在完成處理程序中會定期調用,並且我們可以檢查通過的參數,但它們似乎並不包含我需要的東西。如何檢測NSURLConnection sendAsynchronousRequest是否完成

- (void)sendToServer:(NSString*)url asset:(MYAsset *)asset path:(NSString *)file completion:(MYUploaderBoolBlock)completion{ 
    NSDictionary *uploadParameters = asset.s3Info; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:uploadParameters[@"my_url"]]]; 
    request.HTTPMethod = @"PUT"; 
    request.timeoutInterval = 300; 
    [request addValue:uploadParameters[@"date"] forHTTPHeaderField:@"Date"]; 
    [request addValue:uploadParameters[@"authorization"] forHTTPHeaderField:@"Authorization"]; 
    [request addValue:uploadParameters[@"content_type"] forHTTPHeaderField:@"Content-Type"]; 
    [request addValue:asset.md5 forHTTPHeaderField:@"Content-MD5"]; 
    [request addValue:@"public-read" forHTTPHeaderField:@"x-amz-acl"]; 
    [request addValue:[@(asset.sizeInKB) stringValue] forHTTPHeaderField:@"Content-Length"]; 
    request.HTTPBodyStream = [NSInputStream inputStreamWithFileAtPath:file]; 

    DDLogInfo(@"Uploading %@ to server", uploadParameters[@"my_url"]); 
    DDLogInfo(@"HTTP Headers: %@", [request allHTTPHeaderFields]); 

    [NSURLConnection sendAsynchronousRequest:request 
             queue:self.queue 
          completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){ 
           if ([data length] > 0 && error == nil){ 
            // I am expecting that this can be used to detect progress of the file upload 
            // as well as completion? 
            NSLog(@"received data %d/%d =%f%", data.length, response.expectedContentLength, data.length/(float)response.expectedContentLength); 
            if(data.length == response.expectedContentLength){ 
// This never fires because expectedContentLength is always -1 
             completion(YES); 
            } 
           } 
           else if ([data length] == 0 && error == nil){ 
            NSLog(@"reply empty"); 
           } 
           else if (error != nil && error.code == -1001){ 
            NSLog(@"timed out"); 
           } 
           else if (error != nil){ 
            NSLog(@"Error %@", error.localizedDescription); 
            completion(NO); 
           } 
          }]; 

} 
+0

我肯定一直用快樂[AFNetworking](https://github.com/AFNetworking/AFNetworking/blob/master/ AFNetworking/AFHTTPClient.m)的東西。 – HalR 2013-04-27 21:13:43

回答

3

根據該documentation,完成處理器塊在所述異步發送的結束調用一次。
如果error爲零,操作成功(不知道爲什麼測試數據長度)。

+0

啊,我的錯。我忽略了它在「請求完成或失敗時排隊」的地方。「謝謝你收到。 由於提供此功能的委託方法在iOS 4.3周圍完全棄用,因此如何監視上載的進度?它沒有看到此類中提供該功能的任何方法。 – VaporwareWolf 2013-04-26 21:48:28

+0

再次查看文檔(對於OSX),看起來他們將這些代表放在OSX中,但不在iOS中。文檔在這裏:http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSURLConnectionDelegate_Protocol/Reference/Reference.html – VaporwareWolf 2013-04-26 21:50:11

+0

啊,我看到有一個不同的類使用。這看起來像我正在尋找的東西。 http://developer.apple.com/library/ios/#documentation/Foundation/Reference/NSURLConnectionDownloadDelegate_Protocol/NSURLConnectionDownloadDelegate/NSURLConnectionDownloadDelegate.html – VaporwareWolf 2013-04-26 21:54:08

0
+0

我正在使用NSURLConnection。您正在討論的委託方法不包括在iOS 4.3之後。還有其他一些方法,但它們不提供所需的功能。 ASIHTTPRequest不在積極開發或支持。我正在修改的代碼實際上已經在使用GTM fetcher,但是我正在尋找刪除該庫,如果它可以使用本機代碼。 – VaporwareWolf 2013-04-27 21:43:26

相關問題