Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 自动完成UITextField异步更新UITableView_Ios_Objective C_Iphone_Uitableview_Asynchronous - Fatal编程技术网

Ios 自动完成UITextField异步更新UITableView

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 &

更新tableView时遇到问题。所以,我知道如何用tableView实现自动完成textfield。问题是我的键盘输入没有我想要的那么流畅。流程如下:当我键入3个字符时,将调用我的异步服务器方法。它的响应对象返回我搜索的地址。但问题是,当我输入时,大约半秒钟,我什么都做不了,我需要等待,直到它加载结果。我想用
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联系一次。