iOS更快地搜索集合视图

时间:2014-09-27 04:59:30

标签: ios multithreading core-data uicollectionview uisearchbar

在我的应用程序中,我正在使用一个可搜索的集合视图,让用户找到存储在coredata中的人员记录。我有搜索设置在输入每个字符时运行。最初,这很有效,但是现在我拥有大量数据,用户界面仍然滞后。我想我需要使用另一个线程来做到这一点,但我在多线程中是一个彻头彻尾的菜鸟。

这是我的代码:

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    self.fetchedResultsController = nil;

    NSError *error = nil;
    if (![[self fetchedResultsController]performFetch:&error]) {
        abort();
    }

    [self.collectionView reloadData];
    [self.searchBar becomeFirstResponder];
}

有没有办法加快速度呢?

编辑:我应该注意到搜索字符串正在提取他的谓词...

2 个答案:

答案 0 :(得分:1)

获取所有结果一次并将其保存在数组中。然后从该数组中搜索,而不是每次调用该方法时从核心数据中获取。

答案 1 :(得分:1)

我已经使用THIS方法从数据库中获取UITABLEVIEW,它就像魅力一样。 你是如何实现的:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

你能告诉我们身高的代码,

一些代码示例:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
 self.feed.counter = 50;

 totalcustomers = [cust getTotalCustomer:@"textSearch" searchText:searchtextString custType:YES employeeId:@"" custId:[module getCurrentOrderCustomerId]];

        self.currentSearchTitle = searchText;

        [cust setDatabasePath:DELEGATE.databasePath];

        self.feed.largeArray = (NSMutableArray *) [cust getSeachedCustomer:searchtextString custId:[module getCustomerId:[NSNumber numberWithInt:0]] action:@"textSearch"];

        self.availableCustomers = self.feed.largeArray;

        [self.allCustomerTable reloadData];

        NSLog(@"%d ",totalcustomers);
}

并在UITableviewScroll上加载下50条记录:

- (void)tableViewOverridedForScrollWithSearch:(UITableView *)tableView
                  didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
 NSArray * newPosts;

            newPosts = [self.feed newRowsFrom:indexPath.row andAction:@"textSearch" andSearchString:self.currentSearchTitle];
            NSUInteger newCount = [newPosts count];



            if (newCount) {

                [self.availableCustomers addObjectsFromArray:newPosts];

                [self.allCustomerTable performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
                return;
            }
        }

}

并获得下一个50

- (NSArray *)newRowsFrom:(NSUInteger)newItem andAction:(NSString *)action andSearchString:(NSString *)searchString{

NSLog(@"Counter 1 Print >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> %d", self.counter);

NSArray *result = [self newRowsFromDatabase:self.counter andAction:action andSearchString:searchString];

self.counter = self.counter + 50;
NSLog(@"Counter 2 Print >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> %d", self.counter);
return result;

}

希望它会对你有所帮助 感谢