Swift 如何在完成处理程序中显示程序视图?

Swift 如何在完成处理程序中显示程序视图?,swift,view,completion,Swift,View,Completion,我被困在如何从完成块内部显示视图上。如果在完成块外使用相同的代码,则会显示视图。我确信块正在被执行,并且我在块内部使用的数组的didSet中也有setNeedsDisplay。那么我错过了什么 private var storeViews = [UIView](){ didSet{self.view.setNeedsDisplay()}} hrd.requestData(from: "somepage.php"){[weak self] (status:Bool,items:[[String:

我被困在如何从完成块内部显示视图上。如果在完成块外使用相同的代码,则会显示视图。我确信块正在被执行,并且我在块内部使用的数组的
didSet
中也有
setNeedsDisplay
。那么我错过了什么

private var storeViews = [UIView](){ didSet{self.view.setNeedsDisplay()}}

hrd.requestData(from: "somepage.php"){[weak self] (status:Bool,items:[[String:String]]?) in
    if status
    {
        for var i in (0..<items!.count)
        {
            if let item = items?[i]
            {
                var shape = CGRect()
                shape.size = CGSize(width: 50,height: 30)

                let xPosStr = item["xPosition"]
                let yPosStr = item["yPosition"]

                let position = CGPoint(x: (self?.stringToFloat(xPosStr!))!,y: (self?.stringToFloat(yPosStr!))!)

                shape.origin = position
                let someView = UIView()
                someView.frame = shape
                someView.backgroundColor = UIColor.red

                self?.view.addSubview(someView)
                self?.someViews.append(someView)
            }
        }
    }
}
private var storeview=[UIView](){didSet{self.view.setNeedsDisplay()}
requestData(from:“somepage.php”){[weak self](状态:Bool,项:[[String:String]]?)位于
如果状态
{

对于var i,在(0..首先,
setNeedsDisplay
标记需要重新绘制视图的视图。这会在内部调用
drawRect
。只有在使用自己的自定义实现重写
UIView
子类中的
drawRect
时,才应该调用此函数。我相信您正在发出异步API请求,并且正在添加完成块内的视图。UI更新应仅在主线程上完成。您需要在主线程中添加子视图

DispatchQueue.main.async {
    self?.view.addSubview(someView)
}
此外,由于您在循环中添加视图,您可以对此进行研究。它对UI更新遇到瓶颈有一个非常好的解释

我注意到的另一件事是

for var i in (0..<items!.count)

你的问题还不清楚;你显示的是什么样的视图?数组会倾向于表示一个表视图,在这种情况下,你需要从主que.Post代码调用reloadData。我需要屏幕上有一些方块,所以我使用CGRect,除了显示它们之外,我还将它们存储在一个数组中,数组中有带有setNeedsDi的didSetSplay你可以添加你目前拥有的代码。你是如何绘制这些方块的?CAShapeLayer,带自动布局的UIView,UIView手动框架,UIView.drawRect()?嗨,我刚刚输入了代码(由于小于字符,循环显示不完整)谢谢你,它解决了我的问题,谢谢你对UI瓶颈的建议,我要检查一下
if let items = items{
    for item in items{
        //Do your stuff
    }
}