0

nsタイマーが機能するように使用すると、foo1とfoo1の両方が呼び出されます

-(void)register1
{
    NSRunLoop * runLoop = [NSRunLoop currentRunLoop];
    [runLoop addTimer:[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(foo) userInfo:nil repeats:YES] forMode:NSDefaultRunLoopMode];
     [runLoop addTimer:[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(foo2) userInfo:nil repeats:YES] forMode:NSDefaultRunLoopMode];
    [runLoop run];
}

しかし、私の要件は、両方の nsoperation を作成できるように、さまざまな関数で nstimer を使用する必要があることです。以下のコードは、最初の関数のみを呼び出します。

-(void)register1
{
    NSRunLoop * runLoop = [NSRunLoop currentRunLoop];
    [runLoop addTimer:[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(foo) userInfo:nil repeats:YES] forMode:NSDefaultRunLoopMode];

    [runLoop run];
}
-(void)register2
{

    NSRunLoop * runLoop = [NSRunLoop currentRunLoop];
    [runLoop addTimer:[NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(foo2) userInfo:nil repeats:YES] forMode:NSDefaultRunLoopMode];
    [runLoop run];
}

私は自分の質問に対する答えを見つけました。他の人にも伝えるべきだと思いました。解決策は、関数ごとに異なるスレッドを使用する必要があったことです。

abc *ab=[[abc alloc]init];
//[ab register1];
  //  [ab register2];


    NSOperationQueue *queue=[[NSOperationQueue alloc]init];
    NSInvocationOperation *abc=[[NSInvocationOperation alloc]initWithTarget:ab selector:@selector(register1) object:(nil)];
    NSInvocationOperation *abc2=[[NSInvocationOperation alloc]initWithTarget:ab selector:@selector(register2) object:(nil)];
   [queue addOperation:abc];
    [queue addOperation:abc2];
4

2 に答える 2

1
  1. -[NSRunLoop addTimer:forMode:]使用中は電話をかけないでください+[NSTimer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:]。冗長です。名前のスケジュールされた部分はそれをすべて言います:それはあなたのために現在の実行ループですでにスケジュールされているタイマーを作成しています。
  2. -[NSRunLoop run]一般的には、電話しないでください。runloopを無期限に実行します。基本的には戻りません。したがって、最初の関数から戻ることはないため、2番目の関数は実際には呼び出されていません。これは、NSLogステートメントをさまざまな場所に挿入するか、デバッガーでコードをステップ実行することで簡単に確認できます。

より多くのコード(特にmain()関数)を投稿すると、さらに回答を提供できます。通常、main()からのみ-[NSRunLoop run](またはそのバリエーション)を呼び出します。

于 2012-11-29T06:54:20.260 に答える
0

このようにNSTimerのポイントアドレスを取得できます

NSTimer NSTimer * aTimer = [NSTimerscheduledTimerWithTimeInterval:10 target:self selector:@selector(foo) userInfo:nil repeats:YES] forMode:NSDefaultRunLoopMode];

そしてそれを別の方法に使用します。

于 2012-11-29T07:24:10.680 に答える