Ios 使用缓存实现PFQueryTableViewController

Ios 使用缓存实现PFQueryTableViewController,ios,objective-c,cocoa-touch,uitableview,parse-platform,Ios,Objective C,Cocoa Touch,Uitableview,Parse Platform,用PFQueryTableViewController替换我的TableViewController有点麻烦,但我使用pull刷新和分页使其正常工作。但是,我无法让缓存工作(在.m文件的最底部)。有什么想法吗 我在这里做的唯一其他更改是将单元格中的图像子类化为PFImage ContactsTableViewController.h #import <UIKit/UIKit.h> #import <Parse/Parse.h> #import "FilterViewCon

用PFQueryTableViewController替换我的TableViewController有点麻烦,但我使用pull刷新和分页使其正常工作。但是,我无法让缓存工作(在.m文件的最底部)。有什么想法吗

我在这里做的唯一其他更改是将单元格中的图像子类化为PFImage

ContactsTableViewController.h

#import <UIKit/UIKit.h>
#import <Parse/Parse.h>
#import "FilterViewController.h"

@interface ContactsTableViewController : PFQueryTableViewController <UITableViewDelegate>

@property (nonatomic) NSString *titleName;
@property (nonatomic) NSString *date;
@property (nonatomic) NSString *price;
@property (nonatomic) NSString *imageName;
@property (nonatomic) NSString *venue;
@property (nonatomic) UIImage *image;
@property (nonatomic) NSString *filter;

@property (nonatomic) NSArray *eventsArray;

-(void)retrieveEvents;
-(void)filterEvents;

@end

kPFCachePolicyCacheThenNetwork
意味着同时使用缓存和网络(首先从缓存获取快速性,然后从网络获取下一次的最新信息)。尝试改用
kPFCachePolicyCacheElseNetwork

从外观上看,您不是在使用queryForTable来填充tableview,而是在使用单独的查询

此查询永远不会在tableview中使用

- (PFQuery *)queryForTable
{
    PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];
    query.cachePolicy = kPFCachePolicyCacheThenNetwork;

    return query;
}
相反,这一点:

-(void)retrieveEvents
{

    PFQuery *retrieveEvents = [PFQuery queryWithClassName:@"eventsList"];
    [retrieveEvents setLimit:300];
    [retrieveEvents orderByAscending:@"eventTitle"];
    [retrieveEvents findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            self.eventsArray = [[NSArray alloc] initWithArray:objects];
        }
        [self.tableView reloadData];
    }];
}

试试这个代码。它可能并不完美。但我相信它至少应该指引你正确的方向

#import "ContactsTableViewController.h"
#import "CustomCellTableViewCell.h"
#import "DetailViewController.h"

@interface ContactsTableViewController ()
@end

@implementation ContactsTableViewController

- (id)initWithCoder:(NSCoder *)aCoder
{
    self = [super initWithCoder:aCoder];
    if (self) {
        // The className to query on
        self.parseClassName = @"eventsList";

        // The key of the PFObject to display in the label of the default cell style
        //        self.textKey = @"name";

        // Whether the built-in pull-to-refresh is enabled
        self.pullToRefreshEnabled = YES;

        // Whether the built-in pagination is enabled
        self.paginationEnabled = NO;
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(filterEvents) name:@"updateParent" object:nil];
    self.view.backgroundColor = [UIColor colorWithRed:245/255.0 green:243/255.0 blue:240/255.0 alpha:1];
    tableView.separatorColor = [UIColor clearColor];
}
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    //This reloaded the PFQueryTableView
    [self loadObjects];
}



#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return self.objects.count;
}

// Parse Method

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
{
    static NSString *CellIdentifier = @"cellID";
    CustomCellTableViewCell *customCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    PFObject *object = [self objectAtIndexPath:indexPath];
    customCell.titleLabel.text = object[@"eventTitle"];
    customCell.priceLabel.text = object[@"eventPrice"];
    customCell.customDateLabel.text = object[@"eventDate"];
    customCell.venueNameLabel.text = object[@"eventVenue"];
    PFFile *imageFile = [tempDict objectForKey:@"eventImage"];
    [imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
        if (!error) {
            customCell.customImageView.image = [UIImage imageWithData:data];
        }
    }];
    return customCell;
}


- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    [cell setBackgroundColor:[UIColor darkGrayColor]];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"showEventDetail"]) {
        DetailViewController *destinationVC = [[DetailViewController alloc] init];
        destinationVC = segue.destinationViewController;

        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSDictionary *tempDict = [self.eventsArray objectAtIndex:indexPath.row];


        destinationVC.eventTitle = [tempDict objectForKey:@"eventTitle"];
        destinationVC.eventPrice = [tempDict objectForKey:@"eventPrice"];
        destinationVC.eventDate = [tempDict objectForKey:@"eventDate"];
        destinationVC.venueName = [tempDict objectForKey:@"eventVenue"];
        destinationVC.navigationItem.title = [tempDict objectForKey:@"eventTitle"];

        // Image
        PFFile *imageFile = [tempDict objectForKey:@"eventImage"];
        [imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
            if (!error) {
                destinationVC.eventImageView.image = [UIImage imageWithData:data];
                destinationVC.eventImage = [UIImage imageWithData:data];
            }
        }];

        // GeoPoint
        destinationVC.geoPoint = [tempDict objectForKey:@"GeoPoint"];
    } else if ([segue.identifier isEqualToString:@"showFilterTable"]){

        FilterViewController *vc = (FilterViewController *)[[[segue destinationViewController] viewControllers] objectAtIndex:0];

        [vc setDelegate:self];

    }
}
// Parse Method
-(NSString *)filter
{
    return _filter;
}
-(void)setFilter
{
    _filter = filter;
    [self loadObjects];
}
- (PFQuery *)queryForTable
{
    PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];
    query.cachePolicy = kPFCachePolicyCacheThenNetwork;
    if (self.filter && ![self.filter isEqualToString:@"All Events"]) [query whereKey:@"eventTitle" equalTo:self.filter];
    [query setLimit:300];
    [query orderByAscending:@"eventTitle"];
    return query;
}
@end

你能详细说明一下“不能让它工作”吗?什么不起作用?缓存不起作用。我用这个代码运行应用程序,杀死它,打开飞行模式,重新启动应用程序,我没有得到任何加载。这是一个教程建议做的。它不会先得到缓存的单元格吗?我两次都试过了,但当我在飞行模式下重新打开应用程序时,它仍然没有出现任何问题。你说得对。把线放在setLimit方法的正上方就行了。谢谢大家!如果您没有从self-objectAtIndexPath填充单元格数据,则使用PFQueryTableViewController是不正确的。这是queryForTable返回结果的地方。您有我可以遵循的教程吗?我只知道如何调用viewDidLoad中的方法来检索事件。但现在它没有检索“对象”。我的eventsArray是空的。昨天天气很好。
#import "ContactsTableViewController.h"
#import "CustomCellTableViewCell.h"
#import "DetailViewController.h"

@interface ContactsTableViewController ()
@end

@implementation ContactsTableViewController

- (id)initWithCoder:(NSCoder *)aCoder
{
    self = [super initWithCoder:aCoder];
    if (self) {
        // The className to query on
        self.parseClassName = @"eventsList";

        // The key of the PFObject to display in the label of the default cell style
        //        self.textKey = @"name";

        // Whether the built-in pull-to-refresh is enabled
        self.pullToRefreshEnabled = YES;

        // Whether the built-in pagination is enabled
        self.paginationEnabled = NO;
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(filterEvents) name:@"updateParent" object:nil];
    self.view.backgroundColor = [UIColor colorWithRed:245/255.0 green:243/255.0 blue:240/255.0 alpha:1];
    tableView.separatorColor = [UIColor clearColor];
}
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    //This reloaded the PFQueryTableView
    [self loadObjects];
}



#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return self.objects.count;
}

// Parse Method

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object
{
    static NSString *CellIdentifier = @"cellID";
    CustomCellTableViewCell *customCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    PFObject *object = [self objectAtIndexPath:indexPath];
    customCell.titleLabel.text = object[@"eventTitle"];
    customCell.priceLabel.text = object[@"eventPrice"];
    customCell.customDateLabel.text = object[@"eventDate"];
    customCell.venueNameLabel.text = object[@"eventVenue"];
    PFFile *imageFile = [tempDict objectForKey:@"eventImage"];
    [imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
        if (!error) {
            customCell.customImageView.image = [UIImage imageWithData:data];
        }
    }];
    return customCell;
}


- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    [cell setBackgroundColor:[UIColor darkGrayColor]];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"showEventDetail"]) {
        DetailViewController *destinationVC = [[DetailViewController alloc] init];
        destinationVC = segue.destinationViewController;

        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSDictionary *tempDict = [self.eventsArray objectAtIndex:indexPath.row];


        destinationVC.eventTitle = [tempDict objectForKey:@"eventTitle"];
        destinationVC.eventPrice = [tempDict objectForKey:@"eventPrice"];
        destinationVC.eventDate = [tempDict objectForKey:@"eventDate"];
        destinationVC.venueName = [tempDict objectForKey:@"eventVenue"];
        destinationVC.navigationItem.title = [tempDict objectForKey:@"eventTitle"];

        // Image
        PFFile *imageFile = [tempDict objectForKey:@"eventImage"];
        [imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
            if (!error) {
                destinationVC.eventImageView.image = [UIImage imageWithData:data];
                destinationVC.eventImage = [UIImage imageWithData:data];
            }
        }];

        // GeoPoint
        destinationVC.geoPoint = [tempDict objectForKey:@"GeoPoint"];
    } else if ([segue.identifier isEqualToString:@"showFilterTable"]){

        FilterViewController *vc = (FilterViewController *)[[[segue destinationViewController] viewControllers] objectAtIndex:0];

        [vc setDelegate:self];

    }
}
// Parse Method
-(NSString *)filter
{
    return _filter;
}
-(void)setFilter
{
    _filter = filter;
    [self loadObjects];
}
- (PFQuery *)queryForTable
{
    PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];
    query.cachePolicy = kPFCachePolicyCacheThenNetwork;
    if (self.filter && ![self.filter isEqualToString:@"All Events"]) [query whereKey:@"eventTitle" equalTo:self.filter];
    [query setLimit:300];
    [query orderByAscending:@"eventTitle"];
    return query;
}
@end