[英]Parse.com PFQueryTableViewController Local datastore
我有一个Swift应用程序,其中有PFQueryTableViewController
,我想将本地数据存储与Parse一起使用。 但是,我对将本地数据存储与实时查询一起使用感到困惑。
这是我想做的:
PFQueryTableViewController
,我希望它始终从本地数据存储中获取数据 我该如何实现?
这是我的处理方式-也许它将使您走上正确的道路。 如果您已解决问题,我很想看看您的解决方案。
首先,我提供了一种方便的方法来创建基本查询:
- (PFQuery *)baseQuery
{
PFQuery *query = [PFQuery queryWithClassName:@"MyClass"];
[query orderByDescending:@"myParameter"];
return query;
}
我们希望queryForTable
能够始终访问本地数据存储。
- (PFQuery *)queryForTable
{
return [[self baseQuery] fromLocalDatastore];
}
所以现在剩下要做的就是从网络填充本地数据存储:
- (void)refreshObjects
{
[[[self baseQuery] findObjectsInBackground] continueWithBlock:^id(BFTask *task) {
if (task.error) {
[self.refreshControl endRefreshing];
return nil;
}
return [[PFObject unpinAllObjectsInBackgroundWithName:@"cacheLabel"] continueWithSuccessBlock:^id(BFTask *unused) {
NSArray *objects = task.result;
return [[PFObject pinAllInBackground:objects withName:@"cacheLabel"] continueWithSuccessBlock:^id(BFTask *unused) {
[self.refreshControl endRefreshing];
[self loadObjects];
return nil;
}];
}];
}];
}
我们可以在任何需要的时候调用它:在viewDidLoad
或viewDidAppear
,响应于pull-to-refresh事件(这就是为什么我在那里有UIRefreshControl
代码的原因)或其他任何合适的情况。
我现在发现最好重写loadObjects函数,该函数在每次刷新tableView时都会调用。 只需在调用loadObjects(0,clear:true)(可处理刷新行为且难以覆盖)之前将查询的对象重新加载到本地数据存储中。 (这在Internet连接上应该可以正常工作,或者刷新后所有对象都将无效。您需要添加一些自己的逻辑以求完美。)
var firstTime : Bool = true
//MARK: Query
func basicQuery() -> PFQuery {
let query = PFQuery(className: "CLASSNAME")
return query.orderByAscending("params")
}
override func queryForTable() -> PFQuery {
return basicQuery().fromLocalDatastore()
}
//MARK: - Refresh
//TODO: Should consider the condition with no internet connection
override func loadObjects() -> BFTask {
if firstTime {
// Load frome local data store
firstTime = false
return loadObjects(0, clear: true)
}
return queryForTable().findObjectsInBackground().continueWithBlock({ (task : BFTask!) -> AnyObject! in
if task.error != nil { // No object in local data store
return nil
}
if let objects = task.result as? [PFObject] { // Unpin local datastore objects
return PFObject.unpinAllInBackground(objects, withName: "cacheString")
}
return nil
}).continueWithSuccessBlock({ (task : BFTask!) -> AnyObject! in
// Fetch objects from Parse
return self.basicQuery().findObjectsInBackground()
}).continueWithSuccessBlock({ (task : BFTask!) -> AnyObject! in
if let objects = task.result as? [PFObject] {
return PFObject.pinAllInBackground(objects, withName: "cacheString")
}
return nil
}).continueWithSuccessBlock({ (task : BFTask!) -> AnyObject! in
return self.loadObjects(0, clear: true)
})
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.