개발중인 응용 프로그램에서 테이블 가로 정렬로 사용되는 가로가 UIScrollView
입니다.GCD를 사용하여 UIView 추가
서브 뷰를 추가하면 메인 스레드가 차단되므로 대신 GCD를 사용하고 백그라운드 스레드에서 뷰를 생성하여 메인 큐의 UIScrollView
인스턴스에 추가하기로 결정했습니다.
관련 코드는 이것이다 :
NSUInteger numberOfItems = [_dataSource numberOfItemsInBandView:self];
CGFloat __block nextX = 0.0;
dispatch_queue_t bgQueue = dispatch_queue_create("bandview", NULL);
for (NSUInteger i = 0; i < numberOfItems; i++) {
dispatch_async(bgQueue, ^{
UIView *itemView = [_dataSource bandView:self viewForItemAtIndex:i];
itemView.frame = CGRectMake(nextX, 0, itemView.frame.size.width, itemView.frame.size.height);
dispatch_async(dispatch_get_main_queue(), ^{
[_scrollView addSubview:itemView];
_scrollView.contentSize = CGSizeMake(nextX, self.frame.size.height);
});
nextX += itemView.frame.size.width;
});
}
dispatch_release(bgQueue);
_scrollView
가 UIScrollView
예를 (제대로 초기화)입니다.
내가 예상 한 것은 서브 뷰가 하나씩 하나씩 UIScrollView
에 추가되는 것을 보는 것이지만 대신에 모든 것이 비동기 적으로 실행된다는 것입니다. 그런 다음 스크롤바는 한번에 추가 된 모든 하위 뷰로 새로 고칩니다. 내가 기대하는 것이 아닙니다.)
누구나 내가 여기에서 빠진 것을 발견 할 수 있습니까?
나는 당신이하고있는 일이 괜찮으며 뷰가 생성되어 스크롤 뷰에 매우 빠르게 추가되었다고 생각한다. 지연을 지정할 수있는 경우 dispatch_after를 사용하여 발송물을 main으로 래핑하는 테스트를 수행 할 수 있습니다. 또한 다른 사람들이 제안하는 것처럼 백그라운드 대기열에 대해 동시 대기열을 사용하고 싶을 수도 있습니다. – timthetoolman