2014-06-09 27 views
0

用PFQueryTableViewController替換我的TableViewController時遇到了一些麻煩,但是我使用pull來刷新和分頁。但是,我無法讓緩存工作(在.m文件的底部)。關於發生什麼事的任何想法?使用Cache實現PFQueryTableViewController

我在這裏做的唯一的其他變化是在細胞中將圖像作爲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 

ContactsTableViewController.m

#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]; 

    [self performSelector:@selector(retrieveEvents)]; 

    [[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]; 
} 



#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.eventsArray count]; 
} 

// Parse Method 

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

    NSDictionary *tempDict = [self.eventsArray objectAtIndex:indexPath.row]; 
    self.titleName = [tempDict objectForKey:@"eventTitle"]; 
    self.price = [tempDict objectForKey:@"eventPrice"]; 
    self.date = [tempDict objectForKey:@"eventDate"]; 
    self.venue = [tempDict objectForKey:@"eventVenue"]; 

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

    customCell.titleLabel.text = self.titleName; 
    customCell.priceLabel.text = self.price; 
    customCell.customDateLabel.text = self.date; 
    customCell.venueNameLabel.text = self.venue; 


    return customCell; 
} 


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

-(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]; 

    } 
} 

-(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]; 
    }]; 
} 


-(void)filterEvents 
{ 
    if ([self.filter isEqualToString:@"All Events"]) { 
     [self performSelector:@selector(retrieveEvents)]; 
     return; 
    } 

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

// Parse Method 

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

    return query; 
} 
@end 
+0

您能否詳細說明「無法正常工作」?什麼不工作? – danh

+0

緩存不起作用。我用這段代碼運行應用程序,殺死它,啓動飛行模式,重新啓動應用程序,並且我沒有加載任何東西。這是教程建議要做的事情。 – kerbelda

回答

1

從外觀上看,您並未使用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]; 
    }]; 
} 
+0

你說得對。把它放在setLimit方法的上方。多謝你們! – kerbelda

+0

如果您沒有從自己的objectAtIndexPath填充單元格數據,那麼您不正確地使用PFQueryTableViewController:這是您的queryForTable返回結果的位置。 – hybrdthry911

+0

你有我可以遵循的教程嗎?我只知道如何調用viewDidLoad中的方法來檢索事件。但現在它不是檢索'物體'。我的eventsArray是空的。昨天很好。 – kerbelda

1

kPFCachePolicyCacheThenNetwork意味着同時使用緩存和網絡(首先從緩存中獲取速度,然後從網絡獲得了最新下一次)。嘗試改用kPFCachePolicyCacheElseNetwork

+0

它不會首先獲得緩存單元嗎?我嘗試了兩種方法,但當我以飛行模式重新打開應用程序時,它仍然沒有帶來任何提示。 – kerbelda

0

試試這個代碼。它可能不完美。但我相信它至少應該讓你朝着正確的方向前進。

#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