0

我的应用程序使用 SearchGraphical 在应用程序中搜索注册用户......我的问题是,当我去做研究时,我会看到重复的结果:

名称搜索: Francesca 结果: Francesca (1 cell) Francesca (2 Cell)

**09/14/2013 22:18:17.817 Unipot v.02 [63396: a0b] Successfully retrieved 1 scores.
09/14/2013 22:18:17.818 Unipot v.02 [63396: a0b] Content: Antonella Folino
09/14/2013 22:18:17.818 Unipot v.02 [63396: a0b] Content: francesca Folino
09/14/2013 22:18:17.818 Unipot v.02 [63396: a0b] Content: francesca Folino
09/14/2013 22:18:17.819 Unipot v.02 [63396: a0b] Content: francesca Folino**

我不明白为什么。当您在搜索栏中快速完成键入时会出现此问题。

此外,应用程序会在短时间内返回此通知而崩溃:

**Terminating apt two to uncaught exception 'NSRangeException', reason: '*** - [__NSArrayM objectAtIndex:]: index 10 beyond bounds [0 .. 9] '**

这是我的文件。M 你能帮帮我吗?

#import "Ricerca.h"
#import "Custom.h"

@interface Ricerca () <UISearchDisplayDelegate, UISearchBarDelegate>
@property (nonatomic, strong) UISearchDisplayController *searchController;
@property (nonatomic, strong) NSMutableArray *searchResults;

@end

@implementation Ricerca

- (void)viewDidLoad {
    [super viewDidLoad];
    [self loadObjects];
   self.searchResults = [NSMutableArray array];
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        self.parseClassName = @"_User";



        self.paginationEnabled = YES;

        self.loadingViewEnabled = NO;

       self.objectsPerPage = 10;
    }
    return self;
}



- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait || UIInterfaceOrientationIsLandscape(interfaceOrientation));
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object {



    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Cell"];
    }


    // Configure the cell

    UIColor *color = [[UIColor alloc] initWithRed:0.0 green:0.0 blue:0.0 alpha:0.0];
    cell.detailTextLabel.backgroundColor = color;
    cell.textLabel.backgroundColor = color;


    if (tableView == self.tableView) {
        cell.textLabel.text = [object objectForKey:@"username"];
    }

    else {


        PFObject *searchedUser = [self.searchResults objectAtIndex:indexPath.row];
        NSString *content = [searchedUser objectForKey:@"username"];
        cell.textLabel.text = content;

        NSLog(@"Content: %@", content);


    }

    return cell;

}


-(void)filterResults:(NSString *)searchTerm {

    [self.searchResults removeAllObjects];

    PFQuery *query = [PFQuery queryWithClassName:@"_User"];
    [query whereKey:@"username" containsString:searchTerm];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            // The find succeeded.
            NSLog(@"Successfully retrieved %d scores.", objects.count);
            [self.searchResults addObjectsFromArray:objects];
            [self.searchDisplayController.searchResultsTableView    reloadData];


        } else {
            // Log details of the failure
            NSLog(@"Error: %@ %@", error, [error userInfo]);
        }


    }];

    }

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

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

    if (tableView == self.tableView) {
        return self.objects.count;

    } else {
        return self.searchResults.count;
    }
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (tableView == self.tableView) {
        [super tableView:tableView didSelectRowAtIndexPath:indexPath];

    } else {

        [super tableView:tableView didSelectRowAtIndexPath:indexPath];

    }
}
4

1 回答 1

1

在您filterResults:调用的方法中[self.searchResults addObjectsFromArray:objects];,这会将这些结果添加到已经存在的结果中。如果在第一个查询完成之前此方法被多次命中,您可能会遇到以下情况:

  • 过滤器 1:“弗兰”
  • 明确的结果
  • 开始查询 1
  • 过滤器 2:“法郎”
  • 明确的结果
  • 开始查询 2
  • 过滤器 2 在后台完成:将单个结果添加到数组(内容 1 项)
  • 过滤器 1 在后台完成:将单个结果添加到数组(内容 2 项)

如您所见,无法确定查询何时完成,它们可能会以不同的顺序返回,并且在您再次调用该方法之前可能不会返回。

在这种情况下很难知道要做什么,您可以self.searchResults在成功块中清空,但在上述情况下,最终内容将用于第一个查询而不是第二个查询。

您可以实现某种取消/忽略结果选项,或者在查询开始时添加延迟并希望最好。无论哪种方式,我都建议阅读线程问题和异步操作。

于 2013-09-16T03:25:16.160 回答