gpt4 book ai didi

iOS Parse (Reduce API Requests) 每周在同一天执行一次函数

转载 作者:行者123 更新时间:2023-11-28 18:57:11 24 4
gpt4 key购买 nike

使用 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/

24 4 0
文章推荐: ios - 将 void(^)(UIButton *_strong) 发送到不兼容类型 SEL 的参数时出错
文章推荐: javascript - jQuery Slider 执行意外?
文章推荐: 当屏幕尺寸改变时保持
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com