为什么iPhone在使用swift的while循环时似乎会冻结



我试图通过while循环每2秒拍一张照片。但当我尝试这个时,屏幕会冻结
这是拍照的功能:

func didPressTakePhoto(){
    if let videoConnection = stillImageOutput?.connectionWithMediaType(AVMediaTypeVideo){
        videoConnection.videoOrientation = AVCaptureVideoOrientation.Portrait
        stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: {
            (sampleBuffer, error) in
            if sampleBuffer != nil {

                let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
                let dataProvider  = CGDataProviderCreateWithCFData(imageData)
                let cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, .RenderingIntentDefault)
                let image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Right)
                UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
                //Adds every image taken to an array each time the while loop loops which will then be used to create a timelapse.
                self.images.append(image)

            }

        })
    }

}

为了拍照,我有一个按钮,当一个名为count的变量等于0时,它会在while循环中使用这个函数,但当按下结束按钮时,这个变量等于1,所以while循环结束
这就是startPictureButton操作的样子:

@IBAction func TakeScreanshotClick(sender: AnyObject) {
    TipsView.hidden = true
    XBtnTips.hidden = true
    self.takePictureBtn.hidden = true
    self.stopBtn.hidden = false
    controls.hidden = true
    ExitBtn.hidden = true
    PressedLbl.text = "Started"
    print("started")
    while count == 0{
        didPressTakePhoto()
        print(images)
        pressed = pressed + 1
        PressedLbl.text = "(pressed)"
        print(pressed)
        sleep(2)
    }

}

但当我运行这个并开始延时时,屏幕看起来冻结了
有人知道如何阻止冻结的发生吗?但也知道如何将拍摄的每一张图像添加到一个数组中,这样我就可以把它变成视频了?

问题是处理按钮点击的方法(TakeScreanshotClick方法)在UI线程上运行。因此,如果这个方法从未退出,UI线程就会被卡住,UI就会冻结。

为了避免这种情况,您可以在后台线程上运行循环(阅读有关NSOperationNSOperationQueue的内容)。有时,您可能需要将一些东西从后台线程分派到UI线程(例如,用于UI更新的命令)。

更新:苹果有一个非常棒的文档(是我迄今为止看到的最好的文档)。看看这个:苹果并发编程指南。

您正在主UI线程上调用sleep命令,从而冻结所有其他活动。

另外,我看不出你在哪里设置了count=1?while循环难道不会永远持续下去吗?

相关内容

  • 没有找到相关文章

最新更新