0

我正在尝试访问我的网络服务以从那里获取字符串并AutoCompleteTableView使用以下方法将其放入我的 -

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

NSString *substring = [NSString stringWithString:txtSearching.text];
substring = [substring stringByReplacingCharactersInRange:range withString:string];

if (([substring isEqualToString:@""]) || (substring == nil) || ([substring length] == 0)){

    autoCompleteTableView.hidden=YES;
}

NSString *jsonUrl = [NSString stringWithFormat:MYAPI,substring];
NSURL *url = [NSURL URLWithString:[jsonUrl stringByReplacingOccurrencesOfString:@" " withString:@"%20"]];
NSData *jsonData = [NSData dataWithContentsOfURL:url];
NSArray *data = [jsonData objectFromJSONData];

for (int i = 0; i< [data count]; i++) {

    NSDictionary * dic = [data objectAtIndex:i];
    [elementArray addObject:[dic objectForKey:@"keyword"]];
}  
[self searchAutocompleteEntriesWithSubstring:substring];
[elementArray removeAllObjects];

return YES;
}

和我的searchAutocompleteEntriesWithSubstring

- (void)searchAutocompleteEntriesWithSubstring:(NSString *)substring {

// Put anything that starts with this substring into the autoCompleteArray
// The items in this array is what will show up in the table view
//[elementArray removeAllObjects];
[autoCompleteArray removeAllObjects];

 int lengthOfSubstring = [substring length];
for(NSString *curString in elementArray) {
    int lengthOfCurentString = [curString length];
    if (lengthOfCurentString >=lengthOfSubstring) {
        NSString *substringRangeLowerCase = [[curString substringWithRange:NSMakeRange(0,[substring length])] lowercaseString];
        NSString *substringRangeUpperCase = [[curString substringWithRange:NSMakeRange(0,[substring length])] uppercaseString];
        NSString *substringRangeCase = [[curString substringWithRange:NSMakeRange(0,[substring length])] capitalizedString];
        if (([substring isEqualToString:@""]) || (substring == nil) || ([substring length] == 0)) {
      //      NSLog(@"current string = [%@]",curString);
        }else{
            if (([substring isEqualToString:substringRangeLowerCase]) || ([substring isEqualToString:substringRangeUpperCase]) || ([substring isEqualToString:substringRangeCase])) {


                [autoCompleteArray addObject:curString];                 

            }
        }
    }

}

autoCompleteTableView.hidden = NO;
[autoCompleteTableView reloadData];
}

我的资料——

[{"keyword":"qwerty"},{"keyword":"司法试卷"},{"keyword":"qwe"},{"keyword":"quilts"},{"keyword":"藜麦"},{"keyword":"qwerty0disk"},{"keyword":"q"}]

我不知道为什么我UI变得很慢..我JSONKit也在使用。

4

1 回答 1

0

NSData *jsonData = [NSData dataWithContentsOfURL:url];是同步调用。这意味着调用是在主线程中完成的,它将在其进程中阻塞执行。如果连接很慢,它将阻塞接口(也运行在主线程中),直到它接收到数据。

为了避免在 dataWithContentOfURL 完成时阻塞您的界面,您应该使用 gcd 或实现一个异步类来获取数据。

是关于 gcd 和异步连接的讨论

我希望这将有所帮助。

于 2012-11-20T17:44:30.860 回答