解析查询后在何处重新加载 UITableView 数据



我在正确重新加载UITableView时遇到问题。我的应用程序有时可以工作,有时它会崩溃,因为当 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;
}

更新问题:这是声明 PFimageView 的正确方法吗?我可以在 Xib 文件中拖动一个 UIImageView ,然后将其类更改为 PFImageView?将其更改为 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

使代码复杂化的部分是需要使用查询返回的对象获取图像。 最简单的解决方案是从查询完成处理程序中省略图像提取。

  1. 相反,循环返回的对象,构建数组(这里也有改进的余地,但现在只是坚持问题的崩溃部分)。 在_bookImageData数组中,不要试图保留图像,而是保留每个对象的PFFile......

    // in the loop of objects, omit getDataInBackground and just do...
    [_bookImageData addObject:object[@"image"]];
    
  2. 所述问题的答案(在何处重新加载表)是在构建表数据源的循环之后。

    for (PFObject *object in objects) {
        // code to build all of the arrays, omitting getDataInBackground
        // ...
    }
    [self.tableView reloadData];
    
  3. 在表视图单元格中,将图像视图替换为 PFImageView ,因为它可以为您获取图像数据(以及其他有用的东西,如缓存它)。 然后,您的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];
    

最新更新