使用解析,我试图减少解析的网络调用数量,以限制我对非必需数据的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/

10-12 21:08