自动完成UITextField异步更新UITableView

时间:2016-01-21 09:50:28

标签: ios objective-c iphone uitableview asynchronous

我在更新tableView时遇到问题。所以,我知道如何用tableView实现自动完成文本字段。问题是我的键盘输入并不像我想要的那样顺畅。 Flow是这样的:当我输入3个字符时,我的异步服务器方法被调用。它的响应对象返回我搜索到的地址。但问题是,当我打字时,半秒钟,我什么也做不了,我需要等到它加载结果。我想知道用dispatch_group_t来解决它,但我需要输入并保留异步,然后在notify方法中实际更新我的UI。这是代码:

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。打字应该像输入消息一样,但需要根据最新的输入更新我的表格视图。

4 个答案:

答案 0 :(得分:0)

如果您在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];
            }];
        });

    }
  }
}

答案 1 :(得分:0)

每当你输入3个或更多的char,getAddreses方法调用,这是在主线程上执行的。所以它阻止主线程直到它没有完成。即,直到你的数据重新加载,你没有回应。

尝试:在后台线程上获取数据,只需在主线程上重新加载表。

让我知道这是否有效......

答案 2 :(得分:0)

我在这里找到答案:取消阻止

How to throttle search (based on typing speed) in iOS UISearchBar?

非常感谢你

答案 3 :(得分:0)

在我看来,在这种情况下,典型的解决方案是让用户流利地输入,直到他停止输入。然后,您可以在后台发出请求,并在收到回复后立即更新主线程中的文本字段

在这个方向上,您可以专注于您的业务逻辑,并使用像SearchTextField这样的库作为建议列表UI。