2017-08-13 59 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

相關問題