警告:正在主线程上执行长时间运行的Parse操作

时间:2013-09-14 17:50:44

标签: uitableview parse-platform uisearchdisplaycontroller

我的应用使用SearchGraphical在应用中搜索注册用户...我的问题是,当我去做研究时,显示重复的结果为:

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

**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] '**

这是我的档案。你能帮帮我吗?

#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];

    }
}

1 个答案:

答案 0 :(得分:1)

在您调用filterResults:的{​​{1}}方法中,这会将结果添加到已存在的内容中。如果在第一个查询完成之前多次触发此方法,您可能会遇到以下情况:

  • 过滤器1:“Fran”
  • 结果清晰
  • 启动查询1
  • 过滤器2:“Franc”
  • 结果清晰
  • 启动查询2
  • 过滤器2在后台完成:将单个结果添加到数组(内容1项)
  • 过滤器1在后台完成:将单个结果添加到数组(内容2项)

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

在这种情况下,很难知道该怎么做,你可以在成功块中清空[self.searchResults addObjectsFromArray:objects];,但在上面的情况下,最终内容将是第一个查询而不是第二个查询。 / p>

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