- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 Parse,我试图减少要解析的网络调用量,以限制我对非必要数据的 API 请求。为此,我认为最好每周只在同一天调用一次函数,并将与前一周的任何差异上传到安装类(在我的情况下用于同步推送通知 channel )
那么如何每周在特定的一天调用一次函数呢?如果这一天已经过去了,你会怎么办?假设您希望每个星期四都发生一些事情,但用户直到星期四才打开应用程序,您应该在星期四同步数据?
最佳答案
在实践中,我发现固定间隔在更多情况下比日历里程碑更有意义。有了它,加上很少的 NSDate 逻辑,我可以让我的模型保证它的数据最多过时 N 秒。
为此,我让模型单例仅跟踪上次更新的日期:
// initialize this to [NSDate distantPast]
@property(nonatomic,strong) NSDate *lastUpdate;
该接口(interface)还提供了异步更新方法,如:
- (void)updateWithCompletion:(void (^)(BOOL, NSError *))completion;
我覆盖了 lastUpdate
的合成 getter/setter 来包装持久性:
// user defaults in this case, but there are several ways to persist a date
- (NSDate *)lastUpdate {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
return [defaults valueForKey:@"lastUpdate"];
}
- (void)setLastUpdate:(NSDate *)lastUpdate {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setValue:lastUpdate forKey:@"lastUpdate"];
[defaults synchronize];
}
最后,异步更新不透明地决定当前数据是否足够好,或者我们是否应该调用 parse.com api...
- (void)updateWithCompletion:(void (^)(BOOL, NSError *))completion {
NSTimeInterval sinceLastUpdate = -[self.lastUpdate timeIntervalSinceNow];
NSTimeInterval updatePeriod = [self updatePeriod];
if (sinceLastUpdate < updatePeriod) {
// our current data is new enough, so
return completion(YES, nil);
} else {
// our current data is stale, so call parse.com to update...
[...inBackgroundWithBlock:(NSArray *objects, NSError *error) {
if (!error) {
// finish the update here and persist the objects, then...
self.lastUpdate = [NSDate date];
completion(YES, nil);
} else {
completion(NO, error);
}
}];
}
}
updatePeriod
方法会回答应用程序认为可接受的数据年龄的任何 NSTimeInterval
。通常,我以相当高的频率(比如每天)从 parse.config 获取它。通过这种方式,我可以根据实际情况调整模型更新的频率。
因此,使用非常少的 NSDate
逻辑,我使用它来保持客户端“足够最新”,甚至可以动态决定“足够”部分。
编辑 - 我们仍然可以保持简洁并将我们的模型到期时间设置为一个日历日。我会这样做:
- (NSDate *)lastSaturday {
NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *startOfWeek;
[calendar rangeOfUnit:NSCalendarUnitWeekOfMonth startDate:&startOfWeek interval:NULL forDate:now];
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setDay:-1];
return [calendar dateByAddingComponents:components toDate:startOfWeek options:0];
}
现在,不是在间隔到期时更新,而是在上周六(或您想要的任何工作日...通过调整 setDay:-n 进行调整)之前更新
// change the date condition in updateWithCompletion
if (self.lastUpdate == [self.lastUpdate earlierDate:[self lastSaturday]) {
// do the update
} else {
// no need to update
}
关于iOS Parse (Reduce API Requests) 每周在同一天执行一次函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31078158/
我有一个应用程序,用户在 edittext 中输入数据并按下保存按钮。 通过按“保存”,我将用户数据(在一列中)和当前日期(在另一列中)保存在一个文件中。 然后,我按下另一个按钮并制作绘图(使用图表引
我是一名优秀的程序员,十分优秀!