NSTimer动画,而主线程正在绘制

时间:2012-05-24 10:56:44

标签: iphone ios nstimer nsthread nsrunloop

我已经阅读了有关nstimers,runloops和主要线程的stackoverflow上的一百万篇帖子,但它们似乎没有我想要的相同问题或答案。 我的情况:

  1. 我正在试图制作一些东西,同时有一些'加载'。动画包含几个使用contentOffset来回滚动的滚动视图。我使用NSTimer做这个动画。
  2. 点1的'加载'实际上并不是一些简单的加载,而是一些其他UIViews的绘图当前对用户不可见。
  3. 总而言之,我正在尝试在UIViews上同时绘制时动画一些滚动视图。这是否可能没有它们以这样的方式冲突动画不流畅?如果我使用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上调用图纸时,旋转完全停止。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

UI动画只能在drawOnViews方法退出后才能进行,因此UI运行循环可以获得在主线程中进行动画所需的时间。一种解决方案是将drawOnViews方法切割成非常短的异步段,每个段都快速退出,以便UI动画可以在每个段之间继续。