Swift / iOS子视图不会立即显示在主线程上

时间:2014-12-30 04:08:38

标签: ios multithreading swift uiview subview

所以我在循环中向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方法中设置了print语句,甚至是那些预期的打印语句。

1 个答案:

答案 0 :(得分:1)

代码可能在后台线程上运行,但您必须进入主线程的事实表明您有其他 在后台线程上运行的代码。其他代码是问题的根源。它试图与后台线程上的接口进行通信。这反过来会影响整个绘图系统。