Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 数据检索时didSet线程错误,为什么调用的函数未完全执行?_Swift_Multithreading_Didset - Fatal编程技术网

Swift 数据检索时didSet线程错误,为什么调用的函数未完全执行?

Swift 数据检索时didSet线程错误,为什么调用的函数未完全执行?,swift,multithreading,didset,Swift,Multithreading,Didset,我正在测试一种情况,一些用户可能会面临这样的情况:他们可能会在没有互联网连接的情况下打开应用程序,并且在某个时候,当使用应用程序时,连接会重新出现,因此我希望他们能够检索他们的数据。数据是从后端检索的,它被附加到数组中,但奇怪的是,需要遵循的函数没有完全执行,我得到了一个线程错误。下面是相关的代码块: 使用didSet和被调用函数的数组: var customButtons:[CustomColors]=[ CustomColors(color: UIColor(red: 1,

我正在测试一种情况,一些用户可能会面临这样的情况:他们可能会在没有互联网连接的情况下打开应用程序,并且在某个时候,当使用应用程序时,连接会重新出现,因此我希望他们能够检索他们的数据。数据是从后端检索的,它被附加到数组中,但奇怪的是,需要遵循的函数没有完全执行,我得到了一个线程错误。下面是相关的代码块:

使用didSet和被调用函数的数组:

var customButtons:[CustomColors]=[

        CustomColors(color: UIColor(red: 1, green: 1, blue: 1, alpha: 1 )),
        CustomColors(color: UIColor(red: 247/255, green: 214/255, blue: 217/255, alpha: 1 )),
]{
   didSet {
       if(customButtons[customButtons.count-2].nature.frame.minX == 0){
           print("bugged")
           sortCColor()
       }
  }
}
viewDidLoad()上的获取请求和连接检测器:

要运行的函数:

func sortCColor()->Void{
        for (i, val) in customButtons.enumerated(){
            val.nature.tag = i
            let xDeduct = 6*Int(floor(CGFloat(Int(val.nature.tag)/6)))
            let width = Float(bounds.size.width) > 450 ? CGFloat(Int(0.10*Double(colorScrollW))) : CGFloat(Int(0.15*Double(colorScrollW)))
            let x = CGFloat(0.0073*bounds.size.width) + CGFloat((colorScrollW+Int(width*0.2))*(i - xDeduct))*0.15 // -6*floor
            let y = CGFloat(0.0073*bounds.size.width)
            
            if(val.nature.tag == customButtons.count - 1){
                val.nature.setImage(UIImage(named: "art.scnassets/addColor.png")?.resized(to: CGSize(width: CGFloat(width), height: CGFloat(width))), for: .normal)
            }
            
            else{val.nature.backgroundColor = val.color}
            
            val.nature.frame = CGRect(x: x , y: y + y*floor(CGFloat(Int(val.nature.tag)/6)) + width*floor(CGFloat(Int(val.nature.tag)/6)), width: width, height: width)
            // divisble by 7 for y and use the count for x and dont forget conatainer and scroll extra space
            val.nature.layer.cornerRadius = 0.5 * width
            

            val.nature.addTarget(self, action: #selector(chooseCustomColor), for: UIControl.Event.touchDown)
            
            val.nature.addTarget(self, action: #selector(buttonOut), for: UIControl.Event.touchUpInside)
            val.nature.addTarget(self, action: #selector(buttonOut), for: UIControl.Event.touchDragExit)
           
            colorContainer.addSubview(val.nature)
        }
    }
    

非常感谢您花费的时间和精力

您是否在didSet中尝试过此功能:DispatchQueue.main.async{self.sortColor()}@Berk Akerman谢谢!
func sortCColor()->Void{
        for (i, val) in customButtons.enumerated(){
            val.nature.tag = i
            let xDeduct = 6*Int(floor(CGFloat(Int(val.nature.tag)/6)))
            let width = Float(bounds.size.width) > 450 ? CGFloat(Int(0.10*Double(colorScrollW))) : CGFloat(Int(0.15*Double(colorScrollW)))
            let x = CGFloat(0.0073*bounds.size.width) + CGFloat((colorScrollW+Int(width*0.2))*(i - xDeduct))*0.15 // -6*floor
            let y = CGFloat(0.0073*bounds.size.width)
            
            if(val.nature.tag == customButtons.count - 1){
                val.nature.setImage(UIImage(named: "art.scnassets/addColor.png")?.resized(to: CGSize(width: CGFloat(width), height: CGFloat(width))), for: .normal)
            }
            
            else{val.nature.backgroundColor = val.color}
            
            val.nature.frame = CGRect(x: x , y: y + y*floor(CGFloat(Int(val.nature.tag)/6)) + width*floor(CGFloat(Int(val.nature.tag)/6)), width: width, height: width)
            // divisble by 7 for y and use the count for x and dont forget conatainer and scroll extra space
            val.nature.layer.cornerRadius = 0.5 * width
            

            val.nature.addTarget(self, action: #selector(chooseCustomColor), for: UIControl.Event.touchDown)
            
            val.nature.addTarget(self, action: #selector(buttonOut), for: UIControl.Event.touchUpInside)
            val.nature.addTarget(self, action: #selector(buttonOut), for: UIControl.Event.touchDragExit)
           
            colorContainer.addSubview(val.nature)
        }
    }