我在更新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。打字应该像输入消息一样,但需要根据最新的输入更新我的表格视图。
答案 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)
答案 3 :(得分:0)
在我看来,在这种情况下,典型的解决方案是让用户流利地输入,直到他停止输入。然后,您可以在后台发出请求,并在收到回复后立即更新主线程中的文本字段。
在这个方向上,您可以专注于您的业务逻辑,并使用像SearchTextField这样的库作为建议列表UI。