1

我试图通过使用 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)

    }


}

但是当我运行它并开始游戏中时光倒流时,屏幕看起来冻结了。
有谁知道如何阻止冻结的发生 - 还要将拍摄的每张图像添加到一个数组中 - 这样我就可以把它变成一个视频?

4

2 回答 2

5

问题是处理按钮点击的方法(TakeScreanshotClick方法)是在UI线程上运行的。因此,如果此方法永远不会退出,UI 线程就会卡在其中,并且 UI 会冻结。

为了避免这种情况,您可以在后台线程上运行您的循环(阅读NSOperationNSOperationQueue)。有时您可能需要从后台线程向 UI 线程调度某些内容(例如,用于 UI 更新的命令)。

更新:Apple 有一个非常棒的文档(迄今为止我所见过的最好的)。看看这个:Apple并发编程指南

于 2015-11-07T22:22:01.190 回答
3

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

另外,我看不到您在哪里设置 count = 1?while循环不会永远持续下去吗?

于 2015-11-07T22:20:52.737 回答