0

nstimers、runloops、メインスレッドに関するstackoverflowに関する投稿を何百万も読んだことがありますが、私が探しているのと同じ問題や答えはないようです。私の状況:

  1. いくつかの「読み込みが行われている」間、私はいくつかのものをアニメーション化しようとしています。アニメーションは、contentOffsetを使用して前後に移動するいくつかのスクロールビューで構成されています。このアニメーションはNSTimerを使用して行います。
  2. ポイント1の「ロード中」は、実際には単純なロードではなく、現在ユーザーに表示されていない他のUIViewでの描画です。

結論として、UIViewで同時に描画しながら、いくつかのスクロールビューをアニメーション化しようとしています。アニメーションがスムーズでないように競合することなく、これは可能ですか?私がactivityIndi​​catorViewを使用する場合、それは間違いなく可能です。スピニングホイールが途切れることはなく、常にスムーズに回転しています。runloopsを使おうとしましたが、理解できませんでした。これまでの私のコードのいくつかは次のとおりです。

-(void)startLoading
{
    [self performSelectorInBackground:@selector(showSpinningCells)];
    [self drawOnViews];
}

-(void)drawOnViews
{
    //HERE A LOT OF VIEWS ARE BEING UPDATED AND CALLED SETNEEDSDISPLAY
}

-(void)spinCells
{
    //HERE I USE PERFORMSELECTORONMAINTHREAD TO SET THE
    //CONTENTOFFSET OF THE SCROLLVIEWS
}

-(void)showSpinningCells
{    
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    spinLoop = [NSRunLoop currentRunLoop];
    spinTimer = nil;
    self.userInteractionEnabled = FALSE;
    spinTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2 
                            target:self 
                          selector:@selector(spinCells) 
                          userInfo:nil 
                           repeats:YES] retain];    
    [spinLoop run]; 
    [pool release];
}

何かを試す前に、これが可能かどうか教えてください。可能であれば、どのようにしたらよいでしょうか。現在、回転は見られません。後で何もしなければ回転が見られますが、UIViewsで描画を呼び出すとすぐに、回転が完全に停止します。

4

2 に答える 2

0

あなたはこれを試すことができます、

-(void)showSpinningCells
{    
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    spinTimer = nil;
    self.userInteractionEnabled = FALSE;
    spinTimer = [[NSTimer timerWithTimeInterval:0.2
                                        target:self
                                      selector:@selector(spinCells) 
                                      userInfo:nil
                                        repeats:YES] retain];
    [[NSRunLoop currentRunLoop] addTimer:spinTimer forMode:NSRunLoopCommonModes];
    [pool release];
}

に追加timer_currentRunLoopNSRunLoopCommonModes

于 2012-05-24T11:08:01.283 に答える
0

UI アニメーションは drawOnViews メソッドが終了した後にのみ発生するため、UI 実行ループはメイン スレッドでアニメーションを実行するために必要な時間を取得できます。1 つの解決策は、drawOnViews メソッドを非常に短い非同期セグメントに分割することです。各セグメントはすぐに終了し、各セグメント間で UI アニメーションを継続できます。

于 2012-05-25T01:36:28.520 に答える