Ios 自动完成UITextField异步更新UITableView
更新tableView时遇到问题。所以,我知道如何用tableView实现自动完成textfield。问题是我的键盘输入没有我想要的那么流畅。流程如下:当我键入3个字符时,将调用我的异步服务器方法。它的响应对象返回我搜索的地址。但问题是,当我输入时,大约半秒钟,我什么都做不了,我需要等待,直到它加载结果。我想用Ios 自动完成UITextField异步更新UITableView,ios,objective-c,iphone,uitableview,asynchronous,Ios,Objective C,Iphone,Uitableview,Asynchronous,更新tableView时遇到问题。所以,我知道如何用tableView实现自动完成textfield。问题是我的键盘输入没有我想要的那么流畅。流程如下:当我键入3个字符时,将调用我的异步服务器方法。它的响应对象返回我搜索的地址。但问题是,当我输入时,大约半秒钟,我什么都做不了,我需要等待,直到它加载结果。我想用dispatch\u group\u t来解决这个问题,但我需要输入和退出异步,然后在notify方法中实际更新我的UI。代码如下: if (string.length == 0 &
dispatch\u group\u 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];
}];
});
}
}
if(string.length==0&&range.length>0){
如果(newText.length>=3){
dispatch\u async(dispatch\u get\u main\u queue()^{
[Address getAddreses:newText city:[city getDefaultCity]位置:self.lockedPosition块:^(N错误*错误,N阵列*地址){
self.suggesteddress=地址;
if(addresses.count<自动完成结果\u MAX){
self.suggestedAddressesMaxResult=self.suggestedAddresses;
}
否则{
self.sugestedAddressesMaxResult=[地址子数组WithRange:NSMakeRange(0,自动完成结果最大值)];
}
[自计算TableViewFrame:self.ManualLocationInputTableViewTag:TAG];
[self.myTableView重新加载数据];
}];
});
}
}
我想做的是:尽可能快地输入,而不是等待每个字符半秒钟来更新我的UI。键入应该类似于键入消息,但它需要根据最新键入更新我的表视图。如果您清楚地观察代码以获取web服务的结果,则显示在主队列中。这就是为什么您在键入键盘时会遇到问题。将
dispatch\u get\u main\u 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];
}];
});
}
}
}
//dispatch\u queue\t myQueue=dispatch\u queue\u create(“我的队列”,NULL);
调度队列\u t全局协调当前队列=
调度\获取\全局\队列(调度\队列\优先级\默认值,0)
调度异步(globalConcurrentQueue^{
如果(string.length==0&&range.length>0){
如果(newText.length>=3){
[Address getAddreses:newText city:[city getDefaultCity]位置:self.lockedPosition块:^(N错误*错误,N阵列*地址){
self.suggesteddress=地址;
if(addresses.count<自动完成结果\u MAX){
self.suggestedAddressesMaxResult=self.suggestedAddresses;
}
否则{
self.sugestedAddressesMaxResult=[地址子数组WithRange:NSMakeRange(0,自动完成结果最大值)];
}
dispatch\u async(dispatch\u get\u main\u queue()^{
[自计算TableViewFrame:self.ManualLocationInputTableViewTag:TAG];
[self.myTableView重新加载数据];
}];
});
}
}
}
每当你输入3个或更多字符时,getAddreses方法调用,这是在主线程上执行的。因此它会阻止主线程,直到它不完整。也就是说,直到你的数据重新加载你的ui没有响应
try:在后台线程上获取数据,然后在主线程上重新加载表
让我知道这是否有效…我在这里找到了答案:取消块 非常感谢大家在我看来,这种情况下的典型解决方案是让用户流畅地键入,直到他停止键入。然后您可以在后台发出请求,一旦收到响应,只需更新主线程中的文本字段
在这个方向上,您可以只关注您的业务逻辑,并使用类似于库的建议列表UI。您可以使用AFNetworking framework我使用AfHttpSessionManager将AFNetworking framework用于我的异步调用方法,直到遇到同样的问题。如果我在半秒内键入下一个字符,则不会重新记录新字符nised。检查我的更新答案。即使苹果也使用相同的方法来获取位置的自动完成搜索。让我们试试。我忘了在textfield的ShouldChangeCharactersRange中添加这样的内容:除非你在GCD队列中运行该服务,否则无论你在哪里调用该服务都不是问题。正如其他人所说的,请与AFNetworking联系一次。