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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...