我有一个使用开源类 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];
}
}
}