2017-01-31 35 views
0

兩折的問題:我在一個正確的/高效的莊園使用afterDelayafterDelay效率和cancelPreviousPerformRequestsWithTarget

  1. 是誰?我是新來的Objective-C,所以只是想確保我正確使用它。

  2. 每當在時間到了之前再次調用它時,它會開始運行兩種方法(這是有道理的)。經過一番研究後,我發現cancelPreviousPerformRequestWithTarget,但它似乎取消了再次調用該方法的能力。我不確定是否有更好的方法來處理這個問題。

    [self beginShow:5 myIncrease:0.1]; 
    
    
    - (void)beginShow:(CGFloat)duration myIncrease:(CGFloat)myIncrease{ 
    
        CGFloat currentTime = 0.0; 
    
        while(duration > currentTime){ 
    
         [self performSelector:@selector(setRed) withObject:nil afterDelay:currentTime]; 
         [self performSelector:@selector(setTorchToLevelOn) withObject:nil afterDelay:currentTime]; 
    
         currentTime = currentTime+myIncrease; 
    
         [self performSelector:@selector(setBlack) withObject:nil afterDelay:currentTime]; 
         [self performSelector:@selector(setTorchToLevelOff) withObject:nil afterDelay:currentTime]; 
    
         currentTime = currentTime+myIncrease; 
    
         [self performSelector:@selector(setPurple) withObject:nil afterDelay:currentTime]; 
         [self performSelector:@selector(setTorchToLevelOn) withObject:nil afterDelay:currentTime]; 
    
         currentTime = currentTime+myIncrease; 
    
         [self performSelector:@selector(setDefault) withObject:nil afterDelay:currentTime]; 
         [self performSelector:@selector(setTorchToLevelOff) withObject:nil afterDelay:currentTime]; 
    
         currentTime = currentTime+myIncrease; 
    
        } 
    
    } 
    

回答

0

試試這個代碼,我認爲你需要這個

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(method name) object:nil]; 
+0

這是給我的未申報選擇。但是,當我參考另一個沒有參數的方法時,它可以工作。有什麼想法嗎? '[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(beginShow)object:nil];' –

0

的回答第一個問題是NO。這個邏輯可以使用NSTimer和宏NS_ENUM來聲明具有幾種狀態的枚舉類型YourState(例如YourStateDefault = 0,YourStateRed,YourStateBlack,YourStatePurple)。

爲什麼這麼說?因爲它可以讓您控制邏輯流程和易於維護/調試解決方案。您可以通過引用currentState屬性來檢查系統的狀態(請參閱下面的內容)。

  • (無效)beginShow:(CGFloat的)持續時間myIncrease:(CGFloat的)myIncrease {

    1. 檢查如果一個計時器運行時,比將其停用。
    2. 將currentState設置爲初始狀態值。
    3. 使用repeatInterval = myIncrease設置新計時器,設置值爲remainingTime ==持續時間,操作:@selector(toggleState)
    4. 運行計時器。 }
  • (無效)toggleState { 它應該改變保存在currentState屬性到下一個和呼叫更新UI邏輯當前狀態。切換操作只應在正餘量值時執行。

如果remainingTime變爲負值,您應該關閉定時器並返回,如果它正向運行邏輯。 使用基於currentState值的switch語句確定下一個狀態。將當前狀態設置爲新狀態並運行[self changeUIAccordingToState:currentState]。 您還需要減少每個切換操作的「保持時間」。
}

  • (無效)changeUIAccordingToState:(YourState)狀態{ 應該改變顏色和torchToLevel相應 }
+0

嗯。似乎是一條好路徑!沒有使用NSTimer和宏NS_ENUM之前,所以我不得不玩一會兒,但這似乎很好。謝謝 –