Ios 使用缓存实现PFQueryTableViewController
用PFQueryTableViewController替换我的TableViewController有点麻烦,但我使用pull刷新和分页使其正常工作。但是,我无法让缓存工作(在.m文件的最底部)。有什么想法吗 我在这里做的唯一其他更改是将单元格中的图像子类化为PFImage ContactsTableViewController.hIos 使用缓存实现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
#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