在委托方法中未调用函数 - IOS/Swift
A function is not getting called inside a delegate method - IOS/Swift
我正在开发一个带有自定义相机的应用程序,我在那里使用了 captureOutput 方法(假设是 A),它是 AVCaptureVideoDataOutputSampleBufferDelegate 的委托方法。
我使用了另一个函数(比方说 B),它的行为类似于 javascript 中的 setTimeout。
当我在 A 中调用 B 时,它没有被调用。
这是我的代码
func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
setTimeout(1) { () -> Void in
//piece of code i want to run
}
}
func setTimeout(delay:NSTimeInterval, block:()->Void) -> NSTimer {
return NSTimer.scheduledTimerWithTimeInterval(delay, target: NSBlockOperation(block: block), selector: "main", userInfo: nil, repeats: false);
}
当我在 viewDidLoad() 中调用 setTimeout 方法时,它工作正常。但是在这个特定的方法中,它没有被调用。有人可以给我一个解决方案吗?任何帮助将不胜感激。
已编辑: 对我的代码无法运行的原因感到困惑。有什么想法吗?
这可能更适合您的目的。它会做你想做的事。
//From https://gist.github.com/natecook1000/b0285b518576b22c4dc8 by natecook1000
extension NSTimer {
/**
Runs a closure after a specified time
- parameter delay: The time before the `handler` is called
- parameter handler: What happens after `delay` has passed
- returns: The NSTimer
*/
static public func schedule(delay delay: NSTimeInterval, handler: NSTimer! -> Void) -> NSTimer {
let fireDate = delay + CFAbsoluteTimeGetCurrent()
let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, 0, 0, 0, handler)
CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes)
return timer
}
/**
Runs a closure after a specified time, forever
- parameter interval: The time before the `handler` is called
- parameter handler: What happens after `delay` has passed
- returns: The NSTimer
*/
static func schedule(repeatInterval interval: NSTimeInterval, handler: NSTimer! -> Void) -> NSTimer {
let fireDate = interval + CFAbsoluteTimeGetCurrent()
let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, interval, 0, 0, handler)
CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes)
return timer
}
}
我能够找到一种方法来完成我的工作done.But找不到我以前的代码有什么问题。这是它的样子
func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
let seconds: Int64 = 1 * Int64(NSEC_PER_SEC);
let time = dispatch_time(DISPATCH_TIME_NOW, seconds);
dispatch_after(time, dispatch_get_main_queue(), {
//piece of code i want to run
});
}
我正在开发一个带有自定义相机的应用程序,我在那里使用了 captureOutput 方法(假设是 A),它是 AVCaptureVideoDataOutputSampleBufferDelegate 的委托方法。
我使用了另一个函数(比方说 B),它的行为类似于 javascript 中的 setTimeout。
当我在 A 中调用 B 时,它没有被调用。
这是我的代码
func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
setTimeout(1) { () -> Void in
//piece of code i want to run
}
}
func setTimeout(delay:NSTimeInterval, block:()->Void) -> NSTimer {
return NSTimer.scheduledTimerWithTimeInterval(delay, target: NSBlockOperation(block: block), selector: "main", userInfo: nil, repeats: false);
}
当我在 viewDidLoad() 中调用 setTimeout 方法时,它工作正常。但是在这个特定的方法中,它没有被调用。有人可以给我一个解决方案吗?任何帮助将不胜感激。
已编辑: 对我的代码无法运行的原因感到困惑。有什么想法吗?
这可能更适合您的目的。它会做你想做的事。
//From https://gist.github.com/natecook1000/b0285b518576b22c4dc8 by natecook1000
extension NSTimer {
/**
Runs a closure after a specified time
- parameter delay: The time before the `handler` is called
- parameter handler: What happens after `delay` has passed
- returns: The NSTimer
*/
static public func schedule(delay delay: NSTimeInterval, handler: NSTimer! -> Void) -> NSTimer {
let fireDate = delay + CFAbsoluteTimeGetCurrent()
let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, 0, 0, 0, handler)
CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes)
return timer
}
/**
Runs a closure after a specified time, forever
- parameter interval: The time before the `handler` is called
- parameter handler: What happens after `delay` has passed
- returns: The NSTimer
*/
static func schedule(repeatInterval interval: NSTimeInterval, handler: NSTimer! -> Void) -> NSTimer {
let fireDate = interval + CFAbsoluteTimeGetCurrent()
let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, interval, 0, 0, handler)
CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes)
return timer
}
}
我能够找到一种方法来完成我的工作done.But找不到我以前的代码有什么问题。这是它的样子
func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) {
let seconds: Int64 = 1 * Int64(NSEC_PER_SEC);
let time = dispatch_time(DISPATCH_TIME_NOW, seconds);
dispatch_after(time, dispatch_get_main_queue(), {
//piece of code i want to run
});
}