web-dev-qa-db-ja.com

NSTimerUserInfoを介したデータの受け渡し

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];
}
27
zorro2b

情報を辞書に正しくラップする必要があります。

- (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...
}

タイマーは繰り返しタイマーなので、辞書はもう必要ないので、解放することができます。

49

あなたの呼び出しは正しいですが、辞書をidにキャストする必要はありません。 notifyPause1:メソッドの次の行でuserInfoを取り戻すことができます。

- (void)notifyPause1:(NSTimer *)timer {

    NSDictionary *dict = [timer userInfo];

}
7
schaechtele

あなたはセレクターに与えられた方法でタイマーを求めるかもしれません、

次に、そのタイマーから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
}
6
avishic

soundselectorはObjective-Cオブジェクトではありません:soundは符号なしの数値であり、selectorはC構造体へのポインターです。それはある種のクラッシュを引き起こす可能性があります。

NSValueを使用してselectorの値を保持し、NSNumberを使用してsoundの値を保持する必要があります。 NSValueとNSNumberはオブジェクトであり、NSMutableDictionaryで機能します。

2
Giao

ディクショナリに割り当てるときに、オブジェクトをidにキャストしないでください。 NSDictionaryに直接埋め込むことができるオブジェクトは、すでにNSObjectから派生しており、暗黙的にidにキャストされると見なされます。セレクターの名前をNSStringとして保存し(NSStringFromSelector()を使用)、次にNSSelectorFromString()を使用してセレクターに変換し直します。

クロース

0
Claus Broch