0

I am trying to search my objects on parse.com using a uisearchbar and performing 'findObjectsInBackgroundWithBlock'. I am getting the correct results in my output but they are not showing up in my table.

I was previously doing this without blocks, my code worked, it got the correct results but moved very slowly and I was getting a warning, "Warning: A long-running Parse operation is being executed on the main thread"

I had previously been using the code:

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

[self.searchResults removeAllObjects];

PFQuery *query = [PFQuery queryWithClassName: @"Items"];
[query whereKeyExists:@"itemName"];  
[query whereKeyExists:@"itemDescription"]; 
[query whereKey:@"tags" containsString:searchTerm];

NSArray *results  = [query findObjects];
NSLog(@"%@", results);
NSLog(@"%u", results.count);

[self.searchResults addObjectsFromArray:results];

}

So now I am trying findObjectsInBackgroundWithBlock instead, I have not worked with blocks before so this is where I need help, here is my new code:

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

[self.searchResults removeAllObjects];

PFQuery *query = [PFQuery queryWithClassName: @"Items"];

[query whereKey:@"tags" containsString:searchTerm];

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {

    NSLog(@"%@", objects);
    NSLog(@"%u", objects.count);
[self.searchResults addObjectsFromArray:objects];}];

Here is some more of my code

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

                      if (tableView == self.tableView) {


                          return self.objects.count;

                      } else {

                          return self.searchResults.count;

                      }


                  }

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object {

                      NSString *uniqueIdentifier = @"cell";
                      HomeCell *cell = nil;

                      cell = (HomeCell *) [self.tableView dequeueReusableCellWithIdentifier:uniqueIdentifier];

                      if (!cell) {
                          NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"HomeCell" owner:nil options:nil];

                          for (id currentObject in topLevelObjects)
                          {
                              if([currentObject isKindOfClass:[HomeCell class]])
                              {
                                  cell = (HomeCell *)currentObject;
                                  break;
                              }
                          }
                      }
if (tableView != self.searchDisplayController.searchResultsTableView) {
    NSString *itemName = [object objectForKey:@"itemName"];
    NSString *itemDescription = [object objectForKey:@"itemDescription"];
    //cell.textLabel.text = last;


    cell.cellTitleLabel.text = itemName;
    cell.descriptionLabel.text = itemDescription;

    cell.priceLabel.text = [object objectForKey:@"price"];

    PFFile *thumbnail = [object objectForKey:@"imageFile"];
    PFImageView *thumbnailImageView = cell.imageFile;
    thumbnailImageView.image = [UIImage imageNamed:@"Facebook @2x.png"];
    thumbnailImageView.file = thumbnail;
    [thumbnailImageView loadInBackground];







}
if ([tableView isEqual:self.searchDisplayController.searchResultsTableView]) {

    PFObject *obj2 = [self.searchResults objectAtIndex:indexPath.row];
    PFQuery *query = [PFQuery queryWithClassName:@"Items"];
    PFObject *searchedItems = [query getObjectWithId:obj2.objectId];
    NSString *itemName = [searchedItems objectForKey:@"itemName"];
    NSString *itemDescription = [searchedItems objectForKey:@"itemDescription"];


    cell.cellTitleLabel.text = itemName;
    cell.descriptionLabel.text = itemDescription;

    cell.priceLabel.text = [searchedItems objectForKey:@"itemName"];
    PFFile *thumbnail = [searchedItems objectForKey:@"imageFile"];
    PFImageView *thumbnailImageView = cell.imageFile;
    thumbnailImageView.image = [UIImage imageNamed:@"Facebook @2x.png"];
    thumbnailImageView.file = thumbnail;
    [thumbnailImageView loadInBackground];
}




return cell;

Any help would be greatly appreciated, cheers

4

2 回答 2

5

为了更新表格视图,您需要在reloadData:添加新的搜索结果后调用该方法。确保在提供给的块内调用此方法,findObjectsInBackgroundWithBlock:因为此代码块将在单独的线程上运行。这会导致该方法立即返回,并且此方法之后的代码将在块实际执行之前运行。您的查找对象代码filterResults:应如下所示:

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    // This block is called from a background thread once the query has been executed
    NSLog(@"%@", objects);
    NSLog(@"%u", objects.count);
    [self.searchResults addObjectsFromArray:objects];
    // Refresh the table view on the main thread
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.tableView reloadData];
        [self.searchDisplayController.searchResultsTableView reloadData];
    });
}];
于 2013-09-01T13:38:27.210 回答
0

创建单元格时,请与您的搜索表视图和常规表视图区分开来。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object {
    if (tableView = self.tableView) {
        //Configure your cell normally
    }
    else {
        //Configure your cells using
        cell.someAttribute = self.searchResults[indexPath.row].someAttribute;
    }
于 2013-09-01T12:27:12.203 回答