简体   繁体   English

解析查询后在哪里重新加载UITableView数据

[英]Where to Reload UITableView Data after parse query

I am having trouble getting my UITableView to reload appropriately. 我无法让我的UITableView重新正确加载。 My app sometime works and other times it crashes because one of the data elements is not properly stored in an array when the tableView tries to update. 我的应用有时工作,而有时它崩溃,因为当tableView尝试更新时,数据元素之一未正确存储在数组中。 Can someone point me out the proper place to reload my tableView please. 有人可以指出我合适的地方来重新加载我的tableView吗。

- (void)viewDidLoad {
 [super viewDidLoad];
[self queryForNewBooks];}

-(void)queryForNewBooks{
_bookNameArray = [[NSMutableArray alloc] init];

_authorNameArray  = [[NSMutableArray alloc] init];
_isbnNumberArray = [[NSMutableArray alloc] init];
_bookImageData = [[NSMutableArray alloc] init];

PFQuery *query = [PFQuery queryWithClassName:@"BooksForSale"];
[query orderByDescending:@"createdAt"];
[query findObjectsInBackgroundWithBlock:^( NSArray *objects, NSError *error) {

    if (objects.count >=1) {

        for (PFObject *object in objects) {
            PFFile *imageFile = [object objectForKey:@"image"];
            [imageFile getDataInBackgroundWithBlock:^(NSData *result, NSError *error) {
                if (!error) {
                    NSData *data = result;


                    NSLog(@"HEYYYYYY");
                    if (data == NULL) {

                    }
                    else{
                    [ _bookImageData addObject:data];

                   //I have tried placing it here [self.tableView reloadData] 



                    // NSLog(@"%@",[_bookImageData objectAtIndex:0]);

                    }


                }

            }

             ];

            NSDictionary *bookNameDictionary = object[@"nameOfBook"];
            NSDictionary *authorNameDictionary = object[@"Author"];
            NSDictionary *bookImageDictionary = object [@"image"];
            NSDictionary *isbnNumberDictionary = object [@"isbnNumber"];
            NSString *objectID = [object objectId];

            if  (bookNameDictionary != NULL){
                NSLog(@"Yo bro here is the book name   %@",bookNameDictionary);


                [_bookNameArray addObject:bookNameDictionary];
                NSLog(@"number: %@", bookNameDictionary);
            }

            if (bookNameDictionary == NULL) {
                [_bookNameArray addObject:@""];
                NSLog(@"Blank space");

            }

            if (authorNameDictionary != NULL) {
                [_authorNameArray addObject:authorNameDictionary];
                // [_tableData addObject:ft];
                NSLog(@"Author Name : %@",_authorNameArray);
                //  NSLog(@"the table data is %@",_tableData);
            }
            if (authorNameDictionary == NULL) {
                [_authorNameArray addObject:@""];
                NSLog(@"Blank space");

            }

            if  (isbnNumberDictionary != NULL){
                NSLog(@"Yo bro here is the isbn %@",isbnNumberDictionary);


                [_isbnNumberArray addObject:isbnNumberDictionary];
                NSLog(@"number: %@", isbnNumberDictionary);
                //[self.tableview reloadData];
            }

            if (isbnNumberDictionary == NULL) {
                [_isbnNumberArray addObject:@""];
                NSLog(@"Blank space");

            }

         /*   if (bookImageDictionary !=NULL){
                [_bookImageData addObject:bookImageDictionary];

            }
            if (bookImageDictionary ==NULL){
                [_bookImageData addObject:@""];
                NSLog(@"Blank Space");
            }*/
            if (objectID != NULL) {
                [_objectIDArray addObject:objectID];
                NSLog(@"object id is : %@",objectID);
            }
            if (objectID ==NULL){
                [_objectIDArray addObject:@"blank"];
            }

        }
    }
    // code
}];
 //I have tried placing it here [self.tableView reloadData]   

);

 }


 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [self.bookNameArray count];

}


(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 {
   static NSString *simpleTableIdentifier = @"TableViewCell";

 TableViewCell *cell = (TableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
}
NSLog(@"Here are the book names, %@",_bookNameArray);

cell.bookNameLabel.text = [_bookNameArray objectAtIndex:indexPath.row];
cell.authorNameLabel.text = [_authorNameArray objectAtIndex:indexPath.row];


if ([_bookImageData objectAtIndex:indexPath.row] != NULL ) {
    NSLog(@"it seems to work");
   UIImage *image = [UIImage imageWithData: [_bookImageData objectAtIndex:indexPath.row]];
   cell.bookImageLabel.image = image;
}
else{
    NSLog(@"Error");
}
    return cell;
}

Updating question: Is this the proper way to declare a PFimageView? 更新问题:这是声明PFimageView的正确方法吗? Can I just drag a UIImageView in the Xib file and then change its class to PFImageView? 我可以只将UIImageView拖到Xib文件中,然后将其类更改为PFImageView吗? After changing it to a PFImageView should I be able to just link the view to the outlet as normally done? 将其更改为PFImageView后,是否应该能够像往常一样将视图链接到插座?

#import <UIKit/UIKit.h>
#import <Parse/Parse.h>
#import <ParseUI/ParseUI.h>



@interface TableViewCell : UITableViewCell

@property (nonatomic, weak) IBOutlet UILabel *bookNameLabel;
@property (nonatomic, weak) IBOutlet UILabel *authorNameLabel;
@property (nonatomic, weak) IBOutlet PFImageView *bookImageLabel;
@property (nonatomic, weak) IBOutlet UILabel *priceOfBook;


@end


#import <Parse/Parse.h>
#import "TableViewCell.h"
#import <ParseUI/ParseUI.h>

@implementation TableViewCell


@synthesize bookNameLabel =_bookNameLabel;
@synthesize authorNameLabel = _authorNameLabel;
@synthesize bookImageLabel = _bookImageLabel;

- (void)awakeFromNib {
// Initialization code
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];

// Configure the view for the selected state
}

@end @结束

The part that complicates the code is the need to fetch images using the objects returned by the query. 使代码复杂的部分是需要使用查询返回的对象来获取图像。 The simplest solution is to omit the image fetching from the query completion handler. 最简单的解决方案是忽略从查询完成处理程序中获取图像。

  1. Instead, loop the returned objects, building the arrays (there's room for improvement here, too, but just sticking with the crash part of your problem for now). 取而代之的是,循环返回的对象,构建数组(这里也有改进的余地,但是暂时只解决问题的崩溃部分)。 In the _bookImageData array, don't try to keep images, instead keep the PFFile for each object... _bookImageData数组中,不要尝试保留图像,而应保留每个对象的PFFile ...

     // in the loop of objects, omit getDataInBackground and just do... [_bookImageData addObject:object[@"image"]]; 
  2. The answer to the stated question -- where to reload the table -- is after the loop that builds the table datasource. 在构建表数据源的循环之后,对所述问题(在何处重新加载表)进行了回答。

     for (PFObject *object in objects) { // code to build all of the arrays, omitting getDataInBackground // ... } [self.tableView reloadData]; 
  3. In your table view cell, replace the image view with a PFImageView , because it can take care of fetching the image data for you (and other useful stuff like cacheing it). 在表格视图单元格中,将图像视图替换为PFImageView ,因为它可以为您获取图像数据(以及其他有用的东西,例如缓存数据)。 Your cellForRowAtIndexPath: will then look like this... 您的cellForRowAtIndexPath:将如下所示...

     // bookImageLabel must be a PFImageView // remember, we put the PFFile for each object into the _bookImageData array cell.bookImageLabel.file = _bookImageData[indexPath.row]; [cell.bookImageLabel loadInBackground]; 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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