2013-10-14 56 views
9

我試圖從我的本地節點服務器拉一些數據。服務器正在獲取請求並記錄它,但由於某種原因,我的iOS應用程序不會執行完成處理程序中的任何代碼。下面是代碼:NSURLSessionDataTask不執行完成處理程序塊

- (IBAction) buttonPressed{ 
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1:3000/"]; 
NSURLSessionDataTask *dataTask = 
[self.session dataTaskWithURL:url 
      completionHandler:^(NSData *data, 
           NSURLResponse *response, 
           NSError *error){ 
       nameLabel.text = @"yay!"; 
       /* 
       if (!error){ 
        nameLabel.text = @"noerr"; 
        NSHTTPURLResponse *httpResp = (NSHTTPURLResponse *)response; 
        if (httpResp.statusCode == 200){ 
         NSError *jsonErr; 

         NSDictionary *usersJSON = 
         [NSJSONSerialization JSONObjectWithData:data 
                 options:NSJSONReadingAllowFragments 
                 error:&jsonErr]; 

         if (!jsonErr){ 
         // nameLabel.text = usersJSON[@"username"]; 
          nameLabel.text = @"nojerr"; 

         } 
         else{ 
          nameLabel.text = @"jsonErr"; 
         } 
        } 
       } 
       else{ 
        nameLabel.text = @"Err"; 
       } 
       */ 
      }]; 
[dataTask resume]; 

}

當運行程序時,nameLabel不會更改爲 「耶」。但是,如果我嘗試更改NSURLSessionDataTask行之前的nameLabel,它會更改。

+0

請選擇下面的答案,如果它幫助你。如果您仍然有與答案有關的問題,請隨時發表評論。 – wigging

回答

14

NSURLSessionDataTask在後臺線程中運行。要更新用戶界面中的任何內容(如標籤,按鈕,表格視圖等),您必須在主線程上執行此操作。如果您想更新從completionHandler塊標籤文本,那麼你需要更新的標籤在主線程像這樣:

dispatch_sync(dispatch_get_main_queue(), ^{ 
    nameLabel.text = @"yay!"; 
}); 
12

試試這個神奇:

static NSURLSession* sharedSessionMainQueue = nil; 
if(!sharedSessionMainQueue){ 
    sharedSessionMainQueue = [NSURLSession sessionWithConfiguration:nil delegate:nil delegateQueue:[NSOperationQueue mainQueue]]; 
} 

NSURLSessionDataTask *dataTask = 
[sharedSessionMainQueue dataTaskWithURL:url completionHandler:^(NSData *data, 
           NSURLResponse *response, 
           NSError *error){ 
    //now will be on main thread 
}]; 
[dataTask resume]; 

這給了你原來的行爲NSURLConnection的主線程上完成處理程序,所以你可以安全地更新UI。但是,假設您想解析下載或執行一些繁重的處理,那麼您可能會從操作隊列的後臺線程上的完成處理程序中受益,然後將dispatch_sync用作主線程作爲最後一步。

+2

+1 - 這是一個好得多的方法,因爲您可以*選擇*選擇在後臺線程上運行其他任務,並假設所有內容都在主線程上運行。 –

+0

嗯,Jonathon如果你在完成塊中使用這個方法的一切,將會(只能)在主線程上。 – Fattie

+0

Joe他的意思是根據需要從主線程完成塊創建後臺線程。 – malhal

相關問題