[英]Using Parse.com, how can I query for objects containing a time delta (active within last 3 minutes)?
我正在尝试建立一个解析查询,该查询将在最近3分钟内检索最新的活动用户。 使用PFCloud还是仅使用简单的Parse查询,如何实现?
首选iOS示例。
最简单的方法是拥有一个虚拟字段,您每次用户活动时都将其更新。 不幸的是,您不能在与用户关联的Installation
或User
对象上放置此字段,因为它们受到保护-除非您使用PFCloud调用来处理它。 但是,云代码调用非常昂贵,如果要大量运行此调用,我建议您使用第二个不受保护的Object类,您可以正常查询该类。
像这样存储ping:
- (void)updateLastOnline
{
PFQuery *query = [PFQuery queryWithClassName:@"OnlineInfo"];
//Store the objectID for the associated OnlineInfo object as a pointer field "onlineInfo" on the User object
[query getObjectInBackgroundWithId:[[PFUser currentUser] objectForKey"onlineInfo"] block:^(PFObject *onlineInfo, NSError *error) {
// Do something with the returned PFObject in the gameScore variable.
[onlineInfo setObject:[NSDate date] forKey:@"lastOnline"];
[onlineInfo saveInBackground];
}];
}
然后,您可以使用带有两个日期的标准PFQuery对该“安全”对象进行查询,您可以在我的帖子中找到以下日期 : PFQuery by date
注意:您可能还需要确保仅每隔x分钟调用一次,以防止针对您的Parse安装发送垃圾邮件。 您每秒可以免费获得30个请求,因此您可能不希望每分钟或每5分钟发送一次以上。
这是一种实现方法:
// Set a date variable equal to 3 minutes ago
var date = NSDate()
var threeMinutesAgo = date.dateByAddingTimeInterval(-180)
// I'm using the updatedAt column in a User class
let query = PFQuery(className: "_User")
query.whereKey("updatedAt", greaterThanOrEqualTo: threeMinutesAgo)
query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]!, error: NSError!) -> Void in
if error == nil && objects.count > 0 {
// Do something with queried objects ...
} else {
// Some error handling ...
}
}
请注意,这仅在您定义中的“活动用户”是已与Parse数据库进行交互或通过数据库中的关系进行交互的用户时才有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.