セレクターを適切に定義したいと思います。どうすればそうできますか?
つまり、次のようなことをしたいと思います:
[self performSelector:@selector( function() {variable = 3;} ) withObject:self afterDelay:3];
ここvariable
で、関数を呼び出すクラスの int です。
セレクターを適切に定義したいと思います。どうすればそうできますか?
つまり、次のようなことをしたいと思います:
[self performSelector:@selector( function() {variable = 3;} ) withObject:self afterDelay:3];
ここvariable
で、関数を呼び出すクラスの int です。
ブロックの使用を検討してください:
int multiplier = 7;
int (^myBlock)(int) = ^(int num)
{
return num * multiplier;
};
printf("%d", myBlock(3));
// prints "21"
Appleは、@selectorコールバックが過去の唯一のオプションであった多くの操作にブロックベースのAPIを提供しています。ブロックはiOS4.0以降でのみ使用可能であることに注意してください(ただし、古いiOSバージョンでブロックベースのコードを使用できるようにするソリューションがいくつかあります)。
編集:指定された時間の後にブロックを呼び出す「実際の」例を追加しました:
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC);
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_after(delay, queue, ^{variable = 3});
この例では、 iOS4.0以降でのみ使用可能なグランドセントラルディスパッチを使用していることに注意してください。
このような重要なタスクのために GCD に伴う余分な労力については、別のメソッドを作成することもできます。
- (void) setVariable:(NSNumber *) value
{
variable = [value intValue];
}
- (void) someOtherMethod
{
[self performSelector:@selector(setVariable:) withObject:[NSNumber numberWithInt:3] afterDelay:3.0];
}
ブロックまたは GCD を使用できますが、これによりソリューションと下位互換性が得られます。唯一の欠点はperformSelector:withObject:afterDelay:
、最適な解像度がないことです (たとえば、3.2 秒後に実行される可能性があるなど)。