我有一个嵌套查询,如下所示,即使我使用(或我认为我使用)解析缓存,加载也需要3-4秒。它没有像我预期的那样起作用。是否有可能在第一次启动时从缓存加载,然后从解析云中更新。我是否至少需要核心数据或sqlite3来与本地端的解析同步?
另外,当我使用"query.cachePolicy"表视图得到重复的结果时,我该如何正确使用它。
- (void) retrieveSnapsFromParse {
NSString *currentUserName = [PFUser currentUser].username;
PFQuery *retrieveSnaps = [PFQuery queryWithClassName:@"Snap"];
[retrieveSnaps whereKey:@"from" equalTo:[PFUser currentUser].username];
PFQuery *retrieveSnaps2 = [PFQuery queryWithClassName:@"Snap"];
[retrieveSnaps2 whereKey:@"to" equalTo:[PFUser currentUser].username];
PFQuery * query = [PFQuery orQueryWithSubqueries:@[retrieveSnaps, retrieveSnaps2]];
query.cachePolicy = kPFCachePolicyCacheThenNetwork;
[query orderByDescending:@"createdAt"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
for (PFObject *object in objects) {
Snap *snap = [Snap new];
if([currentUserName isEqualToString:[object objectForKey:@"to"]]) {
snap.userName = [object objectForKey:@"from"];
snap.sentOrReceived = @"Received";
PFFile *snapImageFile = [object objectForKey:@"snappedimage"];
[snapImageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
if (!error) {
UIImage *snapImage = [UIImage imageWithData:data];
snap.snapImage = snapImage;
}
}];
} else if([currentUserName isEqualToString:[object objectForKey:@"from"]]) {
snap.userName = [object objectForKey:@"to"];
snap.sentOrReceived = @"Sent";
}
snap.opened = [object[@"opened"]boolValue];
snap.counter = [object[@"second"]intValue];
snap.objectId = [NSString stringWithFormat:@"%@",object.objectId];
NSDate *createdAt = object.createdAt;
snap.createdDate = createdAt;
// Profile image for UICustomTableViewCell
PFQuery *userQuery = [PFUser query];
[userQuery whereKey:@"username" equalTo:snap.userName];
userQuery.cachePolicy = kPFCachePolicyCacheElseNetwork;
[userQuery getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {
if (object) {
snap.userFirstName = [object objectForKey:@"firstname"];
PFFile *imageFile = [object objectForKey:@"profileimage"];
[imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
if (!error) {
UIImage *image = [UIImage imageWithData:data];
snap.userProfileImage = image;
}
}];
[snapsTemp addObject:snap];
}
snapsTable = snapsTemp;
[self.tableView reloadData];
}];
}
}
}];
}
下面是我在cellForRowAtIndexPath上使用的代码;
cell.cellUserProfileImage.image = snap.userProfileImage;
也在可变数组的.m文件上
@implementation SnapsVC
{
NSMutableArray *snapsTable;
}
在我将以下代码放入cellForRowAtIndexPath而不是retrieveSnapsFromParse 后,它开始按预期工作
PFQuery *userQuery = [PFUser query];
[userQuery whereKey:@"username" equalTo:snap.userName];
userQuery.cachePolicy = kPFCachePolicyCacheElseNetwork;
[userQuery getFirstObjectInBackgroundWithBlock:^(PFObject *object, NSError *error) {
if (object) {
PFFile *imageFile = [object objectForKey:@"profileimage"];
[imageFile getDataInBackgroundWithBlock:^(NSData *data, NSError *error) {
if (!error) {
cell.cellUserProfileImage.image = [UIImage imageWithData:data];
}
}];
cell.cellUserFirstNameLabel.text = [object objectForKey:@"firstname"];
}
}];