2

大家好,感謝提前在如何一些NSURLConnection的代碼轉換爲較新的NSURLSession理解提供任何幫助。 我所試圖做的是做一個POST請求到服務器,併發送編碼爲重點的「照片」中的照片基地64。轉換NSURLConnection的到NSURLSessionUploadTask例如

下面我有一個工作示例寫在NSURLConnection的,我會想它轉換成NSURLSession。

正如我因爲在我的情況下,從我的理解,我應該使用數據任務的蘋果文檔上閱讀它的圖像,如果它像一個視頻,我應該使用上傳任務的大轉移。

關於上傳任務,我找到了下一個tutorial,但問題是,在我的情況下,我還設置了標題,而且我的內容類型應該是multipart/form-data。

NSURL *url = [NSURL URLWithString:myLink]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 

    [request setHTTPMethod:@"POST"]; 

    [request addValue:parameter1 forHTTPHeaderField:header1]; 
    [request addValue:parameter2 forHTTPHeaderField:header2]; 
    [request addValue:parameter3 forHTTPHeaderField:header3]; 
    [request addValue:parameter4 forHTTPHeaderField:header4]; 
    [request addValue:parameter5 forHTTPHeaderField:header5]; 

    [request setHTTPBody:[UIImageJPEGRepresentation(avatarImage, 1.0) base64EncodedDataWithOptions:NSDataBase64Encoding64CharacterLineLength]]; 

    [NSURLConnection sendAsynchronousRequest:request 
             queue:[NSOperationQueue mainQueue] 
          completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){ 

           NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response; 

           NSError *jsonError; 

           if(httpResp.statusCode == 200){ 
            NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data 
                         options:NSJSONReadingAllowFragments 
                          error:&error]; 


            if (!jsonError) { 

             [[NSUserDefaults standardUserDefaults] setObject:[dict objectForKey:@"photo_url"] forKey:@"avatarLink"]; 
             [[NSUserDefaults standardUserDefaults] synchronize]; 

            } 


           } 
           else { 

            NSString *errorCode = [NSString stringWithFormat:@"An error has occured while uploading the avatar: %ld", (long)httpResp.statusCode]; 
            [GeneralUse showAlertViewWithMessage:errorCode andTitle:@"Error"]; 

           } 


          }]; 

,我會想提一提,我試着用雷Wenderlich教程構建一個工作的例子,但我得到關於我設置我的標題的方式

預先感謝您的任何提供幫助的錯誤!

+0

1.你說的代碼示例將「發送編碼爲重點‘照片’中的照片基地64」。不,這個代碼示例沒有使用'photo'鍵。你想使用「照片」鍵嗎? 2.使用'NSURLSession'時,過程基本相同。構建「NSMutableURLRequest」併發布它。如果使用數據任務,請在上面的請求中指定正文。如果使用上傳任務,則不在請求中指定主體,而是將其作爲參數提供給'uploadTaskWithRequest'方法。 3.爲什麼不使用'multipart/form-data'請求(http://stackoverflow.com/questions/26162616) – Rob

回答

1

我用一個簡單的類的HTTPClient我寫的,但遺憾的是它目前不支持上傳任務。但下面我提出了一種創建這種上傳任務的方法。我的客戶保持一個NSURLSession參考和運行任務的字典(關鍵是任務本身,看重的就是收到的NSData)的異步處理的響應數據的接收的(可能不止一個)會話任務的方式。爲了工作我的客戶實現了以下協議:。 我會如下創建上傳任務:

- (NSURLSessionTask *) startUploadTaskForURL: (NSURL *) url withData: (NSData *) data { 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
    [request setHTTPMethod:@"POST"]; 
    [request addValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"]; 
    NSURLSessionUploadTask uploadTask = [self.session uploadTaskWithRequest:request fromData:data]; 
    [self scheduleTask:task]; 
    return task; 
} 

- (void) scheduleTask: (NSURLSessionTask *) task { 
    [self.runningTasks setObject:[NSMutableData data] forKey:task]; 
    [task resume]; 
} 

- (NSMutableData *) dataForTask: (NSURLSessionTask *) task { 
    return [self.runningTasks objectForKey:task]; 
} 

- (void) URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { 
    NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSLog(@"HTTPClient: Data task received data: %@", dataString); 
    NSMutableData *runningData = [self dataForTask:dataTask]; 
    if (!runningData) { 
     NSLog(@"No data found for task"); 
    } 
    [runningData appendData: data]; 
} 

- (void) URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { 
    NSLog(@"HTTPClient: Task completed with error: %@", error); 
    // my client also works with a delegate, so as to make it reusable 
    [self.delegate sessionTask:task completedWithError:error data:[self dataForTask:task]]; 
} 

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend { 
    NSLog(@"HTTPClient: did send body data: %lld of %lld bytes ", totalBytesSent, totalBytesExpectedToSend); 
}