使用解析,我试图减少解析的网络调用数量,以限制我对非必需数据的API请求。为此,我认为最好只在同一天每周一次调用一个函数,并将与前一周的所有差异上载到安装类(在我的情况下,用于同步推送通知通道)
那么,如何在特定的一天每周一次调用函数?如果一天过去了,你会怎么办?假设您希望每个星期四都发生某件事,但是用户要在该星期四之后的周日才打开应用程序才能同步数据?
最佳答案
实际上,我发现在更多情况下,固定间隔比日历里程碑有意义。这样,几乎没有NSDate逻辑,我可以让我的模型保证其数据最多不超过N秒。
为此,我让模型单例仅跟踪上次更新的日期:
// initialize this to [NSDate distantPast]
@property(nonatomic,strong) NSDate *lastUpdate;
该接口还提供了一个异步更新方法,例如:
- (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 - iOS Parse(减少API请求)每周同一天每周执行一次功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31078158/