私はこれが以下を使用して行うことができることを知っています:
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]
ただし、問題は、メソッド呼び出しを1つだけ実行したいということです。この関数を使用すると、呼び出しは互いに積み重ねられます。電話をかけたいのですが、別の電話をかけると最初の電話は却下されます。アイデア?
私はこれが以下を使用して行うことができることを知っています:
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0]
ただし、問題は、メソッド呼び出しを1つだけ実行したいということです。この関数を使用すると、呼び出しは互いに積み重ねられます。電話をかけたいのですが、別の電話をかけると最初の電話は却下されます。アイデア?
メソッドが実行されると、それを停止する方法はありません。
ただし、解雇されない場合はキャンセルできます。あなたはこのようなことをすることができます
//.... your code
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil];
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0];
//.... your code
このようにして、が実行されていない場合にのみ、以前の実行要求をキャンセルできますmyMethod
。
Xcodeのコードスニペットライブラリには、GCD:DispatchAfterという名前のライブラリがあります。これは次のようになります。
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
<#code to be executed on the main queue after delay#>
});
かなり自明です。
要求どおりにスタックを回避するために、他のスレッドでこのセレクターを実行する必要があります。使用する
[self performSelector:(SEL) onThread:(NSThread *) withObject:(id) waitUntilDone:(BOOL)];
そのセレクターでは、必要に応じて遅延を追加できます。このプロセスは別のスレッドで実行されるため、遅延のために他のプロセスを停止することはありません
編集:最新のものだけを使用したいことがわかったので、代わりに次を使用できます:
[self cancelPreviousPerformRequestsWithTarget:self selector:@selector(myMethod) object:nil];
詳細については、このリンクを参照してください。
元の投稿:
そのセクションに到達したときにNOに設定され、メソッドの実行後にYESにリセットされるBOOLを持つことができます。
したがって、たとえば、次のようになります。
if (boolVal) {
boolVal = NO;
[self performSelector:@selector(myMethod) withObject:nil afterDelay:3.0];
}
次に、myMethodで、次のようにします。
boolVal = YES;