【发布时间】:2014-12-30 04:08:38
【问题描述】:
所以我要循环添加几个子视图到我的 ViewController 的视图中;问题是从我添加子视图开始出现约 5 秒的延迟。 添加后,我确保在子视图和我的视图上都调用 setNeedsDisplay,没有骰子。我什至使用NSThread.isMainThread() 仔细检查了代码 是否在主线程 上执行,并且它按预期返回true。这是我的确切代码:
dispatch_async(dispatch_get_main_queue()) {
var nib = UINib(nibName: "ProfileCard", bundle: NSBundle.mainBundle())
var profiles = self.delegate.user!.profilesToShow
//loop to add ProfileCard subviews
while profiles.count > 0 && self.deck.count < self.MAX_DECK_SIZE {
println("Adding Card")
//setup subview
var card = nib.instantiateWithOwner(self, options: nil).first! as ProfileCard
card.delegate = self
card.frame = CGRect(x: (self.view.bounds.width - 300)/2, y: 100, width: 300, height: 200)
card.displayProfile(profiles.first!)
//add subview
self.view.addSubview(card)
self.view.sendSubviewToBack(card)
card.setNeedsDisplay()
self.view.setNeedsDisplay()
//add card to deck, mark as shown
self.deck.append(card)
profiles.removeAtIndex(0)
}
}
此循环中的任何打印语句在子视图实际显示之前约 5 秒运行,我不确定这是由于什么原因。我什至在子视图的 init 方法中设置了打印语句,甚至是那些以预期打印的语句。
【问题讨论】:
-
这段代码究竟是从哪里调用的?它是什么方法的摘录?
-
这是网络请求后通过 NSNotification 触发的方法的摘录。发生网络请求,触发此方法,并且应该创建和添加子视图(这就是这段代码的内容)。但是这段代码会运行,然后在子视图出现在屏幕上之前会有一段延迟。
-
所以你有其他代码被通知在后台线程上运行? that 代码是否尝试与后台线程上的接口对话?这可能是问题的原因。
-
您是否急于收到所有
printlns,然后是延迟,然后是所有绘图? -
这是通知调用的全部代码。为了简单起见,我只是摆脱了方法签名。我相信,这段代码“与之对话”的所有内容都已加载到内存中。
标签: ios multithreading swift uiview subview