2016-01-21 46 views
0

我更新我的tableView時出現問題。所以,我知道如何使用tableView實現自動填充文本字段。問題在於我的鍵盤輸入不如我想要的那麼順利。流程如下所示:當我輸入3個字符時,我的異步服務器方法被調用。它的響應對象返回我搜索到的地址。但問題是,當我輸入時,只需半秒鐘,我什麼都不能做,我需要等到加載結果。我想知道用dispatch_group_t解決它,但我需要進入和離開異步,然後在通知方法實際上更新我的用戶界面。這是代碼:自動完成UITextField異步更新UITableView

if (string.length == 0 && range.length > 0) { 
     if (newText.length >= 3) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [Address getAddreses:newText city:[City getDefaultCity] location:self.lockedPosition block:^(NSError *error, NSArray *addresses) { 
        self.suggestedAddresses = addresses; 
        if (addresses.count < AUTOCOMPLETE_RESULTS_MAX) { 
         self.sugesstedAddressesMaxResult = self.suggestedAddresses; 
        } 
        else { 
         self.sugesstedAddressesMaxResult = [addresses subarrayWithRange:NSMakeRange(0, AUTOCOMPLETE_RESULTS_MAX)]; 
        } 
        [self calculateTableViewFrame:self.manualLocationInput tableViewTag:TAG]; 
        [self.myTableView reloadData]; 
       }]; 
      }); 

     } 
} 

我想做的事:和我一樣快可以輸入,而不是在每一個字符等待半秒更新我的UI。打字應該像輸入消息一樣,但它需要根據最新的輸入更新我的表格視圖。

+0

您可以使用AFNetworking框架 – SukruK

+0

我正在使用AFNetworking框架爲我的異步調用方法使用AFHTTPSessionManager – Flipper

回答

0

如果您清楚地觀察到您的代碼以獲取Web服務的結果正在displath_main-queue中發生。這就是爲什麼你在鍵入鍵盤時遇到問題的原因。將dispatch_get_main_queue塊移動到下一級別,如下所示。這應該是你的問題。

 //dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL); 
    dispatch_queue_t globalConcurrentQueue = 
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
    dispatch_async(globalConcurrentQueue, ^{ 

    if (string.length == 0 && range.length > 0) { 
    if (newText.length >= 3) { 
      [Address getAddreses:newText city:[City getDefaultCity] location:self.lockedPosition block:^(NSError *error, NSArray *addresses) { 
       self.suggestedAddresses = addresses; 
       if (addresses.count < AUTOCOMPLETE_RESULTS_MAX) { 
        self.sugesstedAddressesMaxResult = self.suggestedAddresses; 
       } 
       else { 
        self.sugesstedAddressesMaxResult = [addresses subarrayWithRange:NSMakeRange(0, AUTOCOMPLETE_RESULTS_MAX)]; 
       } 
       dispatch_async(dispatch_get_main_queue(), ^{ 
       [self calculateTableViewFrame:self.manualLocationInput tableViewTag:TAG]; 
       [self.myTableView reloadData]; 
      }]; 
     }); 

    } 
    } 
} 
+0

仍然面臨同樣的問題。如果我在那半秒內輸入下一個字符,那麼這個新字符就不會被識別。 – Flipper

+0

檢查我更新的答案。即使蘋果使用相同的方式來獲取位置的自動完成搜索。咱們試試吧。 –

+0

我忘了補充一點,我是在textfield的shouldChangeCharactersInRange中執行此操作的: – Flipper

0

只要你輸入3或更多的char,getAddreses方法調用,這是在主線程上執行的。所以它阻塞主線程直到它沒有完成。即直到你的數據重新加載你沒有迴應。

嘗試:獲取背地線上的數據並重新加載主線程上的表。

讓我知道,如果這個工程...

0

在我看來,典型在這種情況下,解決方案是讓用戶輸入流暢的內容,直到他停止輸入。然後,您可以在後臺發出請求,只要您收到回覆,只需在主線程中更新文本框即可。

在這個方向上,您可以專注於業務邏輯,並使用像SearchTextField這樣的庫作爲建議列表UI。