2014-09-01 34 views
1

我有一个使用AVCaptureSession在应用内拍照的Swift项目。我很难得到正确的语法来正确清理我的对象。在Obj-C中,建议的代码如下:在Swift中清理AVCaptureSession

// Releases the object - used for late session cleanup 
static void capture_cleanup(void* p) 
{ 
    NewPostPreviewViewController* csc = (NewPostPreviewViewController*)p; 
    [csc release]; // releases capture session if dealloc is called 
} 

// Stops the capture - this stops the capture, and upon stopping completion releases self. 
- (void)stopCapture { 
    // Retain self, it will be released in capture_cleanup. This is to ensure cleanup is done properly, 
    // without the object being released in the middle of it. 
    [self retain]; 

    // Stop the session 
    [session stopRunning]; 

    // Add cleanup code when dispatch queue end 
    dispatch_queue_t queue = dispatch_queue_create("VideoDataOutputQueue", NULL); 
    dispatch_set_context(queue, self); 
    dispatch_set_finalizer_f(queue, capture_cleanup); 
    [dataOutput setSampleBufferDelegate: self queue: queue]; 
    dispatch_release(queue); 
} 

终结会叫capture_cleanup,但我不知道如何设置上下文或指针capture_cleanup功能(甚至函数的定义是什么样子)

到目前为止,我已经试过以下,但我不相信我甚至在正确的轨道上;

let p: UnsafeMutablePointer<NewPostPreviewViewController> = UnsafeMutablePointer.alloc(sizeof(NewPostPreviewViewController)) 
p.initialize(self) 

var videoDataOutputQueue = dispatch_queue_create("VideoDataOutputQueue", nil) 
dispatch_set_context(videoDataOutputQueue, p) 
dispatch_set_finalizer_f(videoDataOutputQueue, ????); 
self.videoDataOutput!.setSampleBufferDelegate(self, queue: videoDataOutputQueue) 
dispatch_release(videoDataOutputQueue) 

任何帮助转换这将是最感谢!

+0

花了很多小时试图弄清楚这一点后,我采取了在我的Swift项目中添加一个'CameraController.m' Objective-C类(以及相关联的头文件),以便连接到摄像头源。控制器完成我需要的所有工作并存储最后拍摄的图像。它也会在拍摄图像时产生通知,从而允许我的Swift类观察通知并获取拍摄的最后一张图像...不是我理想的场景,但它起作用! – SimonM 2014-09-04 23:23:16

回答

0

使用桥接到Objective-C代码解决。通过在我的Swift项目中包含一个CameraController.m Objective-C类(带有关联的头文件),我可以桥接访问相机源。

Objective-C类完成我需要的所有工作,并存储最后拍摄的图像。它也会在拍摄图像时产生通知,允许我的Swift类观察通知并获取最后拍摄的图像。