NSTimer呼び出しのためにuserInfoを介してデータを渡そうとしています。これを行うための最良の方法は何ですか? NSDictionaryを使用しようとしています。これは、Objective-Cオブジェクトがある場合は十分に簡単ですが、他のデータについてはどうでしょうか。私はこのようなことをしたいのですが、それはそのままでは機能しません:
- (void)play:(SystemSoundID)sound target:(id)target callbackSelector:(SEL)selector
{
NSLog(@"pause iPod");
[iPodController pause];
theSound = sound;
NSMutableDictionary *cb = [[NSMutableDictionary alloc] init];
[cb setObject:(id)&sound forKey:@"sound"];
[cb setObject:target forKey:@"target"];
[cb setObject:(id)&selector forKey:@"selector"];
[NSTimer scheduledTimerWithTimeInterval:0
target:self
selector:@selector(notifyPause1:)
userInfo:(id)cb
repeats:NO];
}
情報を辞書に正しくラップする必要があります。
- (void) play:(SystemSoundID)sound target:(id)target callbackSelector:(SEL)selector
{
NSLog(@"pause iPod");
[iPodController pause];
theSound = sound;
NSMutableDictionary *cb = [[NSMutableDictionary alloc] init];
[cb setObject:[NSNumber numberWithInt:sound] forKey:@"sound"];
[cb setObject:target forKey:@"target"];
[cb setObject:NSStringFromSelector(selector) forKey:@"selector"];
[NSTimer scheduledTimerWithTimeInterval:0
target:self
selector:@selector(notifyPause1:)
userInfo:cb
repeats:NO];
[cb release];
}
notifyPause1:
、すべてを取得します:
- (void)notifyPause1:(NSTimer *)timer {
NSDictionary *dict = [timer userInfo];
SystemSoundID sound = [[dict objectForKey:@"sound"] intValue];
id target = [dict objectForKey:@"target"];
SEL selector = NSSelectorFromString([dict objectForKey:@"selector"]);
// Do whatever...
}
タイマーは繰り返しタイマーなので、辞書はもう必要ないので、解放することができます。
あなたの呼び出しは正しいですが、辞書をidにキャストする必要はありません。 notifyPause1:メソッドの次の行でuserInfoを取り戻すことができます。
- (void)notifyPause1:(NSTimer *)timer {
NSDictionary *dict = [timer userInfo];
}
あなたはセレクターに与えられた方法でタイマーを求めるかもしれません、
次に、そのタイマーからuseInfoを取得できます(timer.userInfo):
- (void)settingTimer
{
[NSTimer scheduledTimerWithTimeInterval:kYourTimeInterval
target:self
selector:@selector(timerFired:)
userInfo:yourObject
repeats:NO];
}
- (void)timerFired:(NSTimer*)theTimer
{
id yourObject = theTimer.userInfo;
//your code here
}
sound
とselector
はObjective-Cオブジェクトではありません:sound
は符号なしの数値であり、selector
はC構造体へのポインターです。それはある種のクラッシュを引き起こす可能性があります。
NSValueを使用してselector
の値を保持し、NSNumberを使用してsound
の値を保持する必要があります。 NSValueとNSNumberはオブジェクトであり、NSMutableDictionaryで機能します。
ディクショナリに割り当てるときに、オブジェクトをidにキャストしないでください。 NSDictionary
に直接埋め込むことができるオブジェクトは、すでにNSObject
から派生しており、暗黙的にidにキャストされると見なされます。セレクターの名前をNSString
として保存し(NSStringFromSelector()
を使用)、次にNSSelectorFromString()
を使用してセレクターに変換し直します。
クロース