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