在我正在開發的應用程序中,我有一個水平的UIScrollView
用作一種表格視圖。使用GCD添加UIViews
向它添加子視圖會阻塞主線程,所以我決定改用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