微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – 在大量计算过程中如何让屏幕停止冻结?

好吧,我正在尝试做的是更改某个图像的像素数据.我想使用每次循环作为进度条时向右移动的UIView.然而,正在发生的事情是屏幕在计算过程中冻结,直到完成后才会发生任何事情.状态栏时钟也不会更新.有没有办法将这些计算以某种方式移动到背景并仍然使用屏幕空间?

func lock() {

    let lockView =  UIImageView(image: self.photoBackgroundView.image!)
    var progressBar = UIView(frame: CGRectMake(-self.view.width,self.view.width,20)
    let increment = progressBar.width/self.photoBackgroundView.width
    var password = self.textField.text!
    if password == "" {
        password = " "
    }
    var currentIndex = 0



    let imageRect = CGRectMake(0,self.photoBackgroundView.image!.size.width,self.photoBackgroundView.image!.size.height)

    UIGraphicsBeginImageContext(self.photoBackgroundView.image!.size)
    let context = UIGraphicsGetCurrentContext()

    CGContextSaveGState(context)
    CGContextDrawImage(context,imageRect,self.photoBackgroundView.image!.CGImage)
    for x in 0...Int(self.photoBackgroundView.image!.size.width) {
        print(x)

        progressBar.frame.origin.x += (CGFloat(x) * increment)
        self.view.addSubView(progressBar)


        for y in 0...Int(self.photoBackgroundView.image!.size.height) {
            let pointColor = lockView.layer.colorOfPoint(CGPoint(x: x,y: y))

            if currentIndex == Array(password.characters).count {
                currentIndex = 0
            }
            let red = encrypt(pointColor.components.red,passwordChar: Array(password.characters)[currentIndex],currentIndex: currentIndex,x: x,y: y)
            currentIndex++
            if currentIndex == Array(password.characters).count {
                currentIndex = 0
            }
            let green = encrypt(pointColor.components.green,y: y)
            currentIndex++
            if currentIndex == Array(password.characters).count {
                currentIndex = 0
            }
            let blue = encrypt(pointColor.components.blue,y: y)
            currentIndex++

            CGContextSetRGBFillColor(context,red,green,blue,pointColor.components.alpha)
            CGContextFillRect(context,CGRectMake(CGFloat(x),CGFloat(y),1,1))

        }



    }

    CGContextRestoreGState(context)
    let newImage = UIGraphicsGetimageFromCurrentimageContext()
    self.photoBackgroundView.image = newImage
    self.slideView.addSubview(photoBackgroundView)
    self.view.addSubview(self.slideView)
}

解决方法

您可以在 background thread中进行这些计算.

斯威夫特2:

let priority = disPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority,0)) {
    // Put the calculations here
    dispatch_async(dispatch_get_main_queue()) {
        // any updates of the UI need to be here to do them in the main thread after your background task. For example adding subviews
    }
}

斯威夫特3:

this answer

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐