简体   繁体   中英

Search more than 1000 queries in parse iOS

I have a parse iOS app where I need to search the names of a couple thousand users (~3,000). I am trying to modify my search code so that I can do this but I need help. Right now my code for search looks like this:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    if (tableView == self.tableView) {

        return self.objects.count;

    } else {
        return self.searchResults.count;

    }

}


-(void)filterResults:(NSString *)searchTerm :(int)limit :(int)skip {


    [self.searchResults removeAllObjects];

    PFQuery *query = [PFQuery queryWithClassName:@"_User"];
    [query whereKey:@"isTeacher" equalTo:@"False"];
    [query setLimit: limit];
    [query setSkip: skip];

    [[[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (objects.count == limit) {
            [self performTeacherQueryWithLimit:limit andSkip:skip+limit];
        }

        else{
        NSArray *results = [NSArray arrayWithArray:objects];

        NSLog(@"%@", results);
        NSLog(@"%lu", (unsigned long)results.count);
        NSLog(@"results^");


        [self.searchResults addObjectsFromArray:results];

        NSPredicate *searchPredicate =
        [NSPredicate predicateWithFormat:@"SELF.name contains[c] %@",searchTerm];
        _searchResults = [NSMutableArray arrayWithArray:[results filteredArrayUsingPredicate:searchPredicate]];
        [self.searchDisplayController.searchResultsTableView reloadData];

        NSLog(@"%@", _searchResults);
        NSLog(@"%lu", (unsigned long)_searchResults.count);
        NSLog(@"search results^");
        }

    }];
    ]]

}

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    [self filterResults:searchString];
    return YES;
}

This code will not work because I call the filterResults at the bottom without all the correct parameters but that is because I got halfway through and now I am stuck. I know I need to use the setSkip but I'm not sure how to make that work for my searching. Any help would be awesome! Thanks!

I do this sort of thing with a method that handles the query and its results together, like this:

- (void)runQuery:(PFQuery *)query filling:(NSMutableArray *)array completion:(void (^)(BOOL))completion {
    query.skip = array.count;
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            [array addObjectsFromArray:objects];
            if (objects.count < query.limit) {
                return completion(YES);
            } else {
                [self runQuery:query filling:array completion:completion];
            }
        } else {
            return completion(NO);
        }
    }];
}

Use it like this:

PFQuery *query = [PFQuery queryWithClassName:@"MyClass"];
// setup query
query.limit = // set this to a reasonable size
// the given method will do ceil(N / limit) finds, where N is the number
// of rows that satisfy the query

NSMutableArray *array = [@[] mutableCopy];
[self runQuery:query filling:array completion:^(BOOL success) {
    NSLog(@"%@", array);
    // you would do your local search and set search results here
}];

A more functional version would call a progress block in between queries. This would allow you to continuously update results. For that, just add a progress block parameter and call it right after [array addObjectsFromArray:objects]; .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM