Ios DrawRect完成和UI刷新之间的时间间隔

Ios DrawRect完成和UI刷新之间的时间间隔,ios,drawrect,lag,Ios,Drawrect,Lag,我有一个使用开源类MMGridView的iPad应用程序。 基本上我执行一个CoreData查询,然后这个类在屏幕上以网格模式绘制框来表示结果。盒子里有照片。 一切正常,只是有时候在屏幕上绘制UI之前会出现无法解释的时间延迟。有时刷新是即时的,有时超过20秒。它的行为似乎很随机 我已设法确定: 每次都会调用DrawRect DrawRect方法中没有出现延迟 当我运行时间分析器时,据我所知,在这个时间延迟期间没有发生任何事情 我的问题是,调用DrawRect后会发生什么,我可以尝试查看以确定

我有一个使用开源类MMGridView的iPad应用程序。 基本上我执行一个CoreData查询,然后这个类在屏幕上以网格模式绘制框来表示结果。盒子里有照片。 一切正常,只是有时候在屏幕上绘制UI之前会出现无法解释的时间延迟。有时刷新是即时的,有时超过20秒。它的行为似乎很随机

我已设法确定:

  • 每次都会调用DrawRect
  • DrawRect方法中没有出现延迟
  • 当我运行时间分析器时,据我所知,在这个时间延迟期间没有发生任何事情
我的问题是,调用DrawRect后会发生什么,我可以尝试查看以确定问题

任何想法都将不胜感激

还要注意的是,用户交互能够缩短延迟。 -旋转iPad(触发重画)总是会使ui立即刷新 -按按钮重新执行相同的查询通常会刷新屏幕

所以看起来我遇到的只是一些随机延迟,而不是任何类型的处理器/工作负载问题。问题是,以编程方式,我无法判断UI是否已更新。否则我可以要求它重新绘制

我包含了DrawRect方法中的代码,以防引发任何想法,但据我所知,此方法在延迟发生之前完成

- (void)drawRect:(CGRect)rect {

if (self.dataSource && self.numberOfRows > 0 && self.numberOfColumns > 0) {
    NSInteger noOfCols = self.numberOfColumns;
    NSInteger noOfRows = self.numberOfRows;
    NSUInteger cellsPerPage = noOfCols * noOfRows;
    NSLog(@"rows = %d, cols = %d", noOfCols, noOfRows);
    CGRect gridBounds = self.scrollView.bounds;
    CGRect cellBounds = CGRectMake(0, 0, gridBounds.size.width / (float)noOfCols, 
                                   gridBounds.size.height / (float)noOfRows);

    CGSize contentSize = CGSizeMake(self.numberOfPages * gridBounds.size.width, gridBounds.size.height);
    [self.scrollView setContentSize:contentSize];

    for (UIView *v in self.scrollView.subviews) {
        [v removeFromSuperview];
    }

    for (NSInteger i = 0; i < [self.dataSource numberOfCellsInGridView:self]; i++) {
        MMGridViewCell *cell = [self.dataSource gridView:self cellAtIndex:i];
        [cell performSelector:@selector(setGridView:) withObject:self];
        [cell performSelector:@selector(setIndex:) withObject:[NSNumber numberWithInt:i]];

        NSInteger page = (int)floor((float)i / (float)cellsPerPage);
        NSInteger row  = (int)floor((float)i / (float)noOfCols) - (page * noOfRows);

        CGPoint origin = CGPointMake((page * gridBounds.size.width) + ((i % noOfCols) * cellBounds.size.width), 
                                     (row * cellBounds.size.height));

        CGRect f = CGRectMake(origin.x, origin.y, cellBounds.size.width, cellBounds.size.height);
        cell.frame = CGRectInset(f, self.cellMargin, self.cellMargin);

        [self.scrollView addSubview:cell];
    }
}
}
-(void)drawRect:(CGRect)rect{
if(self.dataSource&&self.numberOfRows>0&&self.numberOfColumns>0){
NSInteger noOfCols=self.numberOfColumns;
NSInteger noOfRows=self.numberOfRows;
NSUTEGER cellsPerPage=noOfCols*noOfRows;
NSLog(@“行=%d,列=%d”,noOfCols,noOfRows);
CGRect gridBounds=self.scrollView.bounds;
CGRect cellBounds=CGRectMake(0,0,gridBounds.size.width/(float)noOfCols,
gridBounds.size.height/(float)noOfRows);
CGSize contentSize=CGSizeMake(self.numberOfPages*gridBounds.size.width,gridBounds.size.height);
[self.scrollView setContentSize:contentSize];
for(self.scrollView.subview中的UIView*v){
[v从SuperView移除];
}
对于(NSInteger i=0;i<[self.dataSource numberOfCellsInGridView:self];i++){
MMGridViewCell*cell=[self.dataSource gridView:self-cellAtIndex:i];
[单元格性能选择器:@selector(setGridView:)with object:self];
[cell performSelector:@selector(setIndex:)with object:[NSNumber numberWithInt:i]];
NSInteger页面=(int)floor((float)i/(float)cellsPerPage);
NSInteger row=(int)地板((浮动)i/(浮动)noOfCols)-(第*页noOfRows);
CGPoint origin=CGPointMake((page*gridBounds.size.width)+(i%noOfCols)*cellbunds.size.width),
(行*单元格边界、大小、高度);
CGRect f=CGRectMake(origin.x,origin.y,cellBounds.size.width,cellBounds.size.height);
cell.frame=CGRectInset(f,self.cellMargin,self.cellMargin);
[self.scrollView addSubview:cell];
}
}
}

由于Peter Hosey在回答此问题时对何时使用和何时不使用drawRect:进行了非常清晰和简洁的描述,所以问题得到了解决。

基本上,这是我正在使用的开源类MMGridView中的一个bug,因为它不应该使用drawRect:在UIScrollView上设置框或单元格。这是因为没有实际绘图


因此,通过更改上述方法的名称,并在我之前调用setNeedsDisplay的地方直接调用它,就不再存在任何随机延迟。

由于Peter Hosey在回答此问题时对何时使用和何时不使用drawRect:进行了非常清晰和简洁的描述,问题得到了解决。

基本上,这是我正在使用的开源类MMGridView中的一个bug,因为它不应该使用drawRect:在UIScrollView上设置框或单元格。这是因为没有实际绘图


因此,通过更改上述方法的名称,并在我以前调用setNeedsDisplay的地方直接调用它,就不再存在任何随机延迟。

我不明白您的答案。你能再解释一下吗(包括一些代码)?我对MMGridView有问题。基本上,我正在设置x行和y列,有时它会显示y行和x列的奇怪位置。。。我试过很多组合,但我不知道是什么引起的。即使demo也不能正常工作(我正在iOS6上测试它),我的问题是它选择绘制网格的方式依赖于MMGridView.m中的方法(((void)drawRect:(CGRect)rect),但该方法仅在视图需要重新绘制自身时才被调用。您可以通过调用“[self.view setNeedsDisplay]”来完成此操作。然而,在这种方法中没有实际绘图。该方法实际上创建并放置视图以形成网格。因此setNeedsDisplay不会触发调用此方法。我只是简单地将它重命名为(-(void)drawCells)并直接使用“[myMMGridView drawCells]”调用它。你们在ios5中滚动页面时,是否有闪动gridview的问题?在ios6中没关系,我不明白你的意思。你能再解释一下吗(包括一些代码)?我对MMGridView有问题。基本上,我正在设置x行和y列,有时它会显示y行和x列的奇怪位置。。。我试过很多组合,但我不知道是什么引起的。即使demo也不能正常工作(我正在iOS6上测试它),我的问题是它选择绘制网格的方式依赖于MMGridView.m中的方法(((void)drawRect:(CGRect)rect),但该方法仅在视图需要重新绘制自身时才被调用。您可以通过调用“[self.view setNeedsDisplay]”来完成此操作。但是,没有实际的图纸