2017-08-13 60 views
0

我想限制一个方法可以被调用的频率。 我的目的是限制我处理API回调的速度。 (当我希望它们时,某些API回调不会停止)。最佳限制方法调用率,一个方法的频率可以调用

我有一个工作解决方案,请提供一个更清洁的解决方案。

请提供更好的解决方案。

-(void)callbackRateLimited:(id)someDataProvided { 

    static NSDate *date; 
    static NSUInteger count; 

    if (!date) { 
     date = [NSDate new]; 
     count = 0; 
    } 

    double duration = fabs([date timeIntervalSinceNow]); 
    NSLog(@"Duration :%f count:%lu",duration,count); 

    if (count == 0) { 

     NSLog(@"No waiting... processing API"); 

     [self processAPICallback]; 
     count++; 
     return; 
    } 

    if (duration < 10.0f) { // 10 seconds 
     NSLog(@"waiting.... too fast slow down"); 
     return; 
    } 

    NSLog(@"reset waiting state"); 
    //count = 0; not required here. 
    date = nil; 
} 

回答

2

像下面的东西应该工作。这有以下警告:

  • 你不想处理被忽略的数据,你还没有收到 调用一段时间。
  • 您想限制所有类的实例的回调率。如果您想限制每个对象实例,则请使用 lastTime而不是静态类变量。
  • 尚未对其进行测试

- (void) callbackRateLimited:(id)someDataProvided 
{ 
    static NSDate *lastTime = nil; 
    if (!lastTime) { 
     lastTime = [NSDate distantPast]; 
    } 

    NSDate *now = [NSDate date]; 
    if ([now timeIntervalSinceDate:lastTime] > 10) { 
     lastTime = now; 
     [self processAPICallback]; 
    } 
} 
+0

请注意,您最终可能会错过一些更改。你需要的东西说,“嘿!一个回调被压制,如果我们没有看到N mess内的回调,然后继续,并启动任何可能还没有处理的变化。”这可以通过多种方式完成,其中会有不同程度的不一致性。 – bbum

相关问题