Drop `.onError()`

Better to just have one callback for when it's done.
This commit is contained in:
Sindre Sorhus 2020-02-14 19:27:09 +07:00
parent a9a53cbb53
commit ef9d1b0030
3 changed files with 29 additions and 18 deletions

View File

@ -2,6 +2,10 @@ import Foundation
import AVFoundation
import Aperture
func delay(seconds: TimeInterval, closure: @escaping () -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: closure)
}
guard
let deviceInfo = Aperture.Devices.iOS().first,
let device = AVCaptureDevice(uniqueID: deviceInfo.id)
@ -17,17 +21,23 @@ guard let aperture = try? Aperture(destination: url, iosDevice: device) else {
exit(1)
}
aperture.onError = {
print($0)
aperture.onFinish = {
if let error = $0 {
print(error)
exit(1)
}
print("Finished recording:", url.path)
exit(0)
}
aperture.start()
print("Recording the screen of “\(deviceInfo.name)” for 5 seconds")
sleep(5)
delay(seconds: 5) {
aperture.stop()
}
print("Finished recording:", url.path)
setbuf(__stdoutp, nil)
RunLoop.current.run()

View File

@ -16,8 +16,7 @@ public final class Aperture: NSObject {
private var activity: NSObjectProtocol?
public var onStart: (() -> Void)?
public var onFinish: (() -> Void)?
public var onError: ((Swift.Error) -> Void)?
public var onFinish: ((Swift.Error?) -> Void)?
public var onPause: (() -> Void)?
public var onResume: (() -> Void)?
public var isRecording: Bool { output.isRecording }
@ -158,7 +157,11 @@ public final class Aperture: NSObject {
public func stop() {
output.stopRecording()
session.stopRunning()
// This prevents a race condition in Apple's APIs with the above and below calls.
sleep(for: 0.1)
self.session.stopRunning()
}
public func pause() {
@ -190,14 +193,7 @@ extension Aperture: AVCaptureFileOutputRecordingDelegate {
public func fileOutput(_ captureOutput: AVCaptureFileOutput, didFinishRecordingTo outputFileURL: URL, from connections: [AVCaptureConnection], error: Swift.Error?) {
shouldPreventSleep = false
let FINISHED_RECORDING_ERROR_CODE = -11_806
if let error = error, error._code != FINISHED_RECORDING_ERROR_CODE {
onError?(error)
} else {
onFinish?()
}
onFinish?(error)
}
public func fileOutput(_ output: AVCaptureFileOutput, didPauseRecordingTo fileURL: URL, from connections: [AVCaptureConnection]) {

View File

@ -82,3 +82,8 @@ extension Optional {
return value
}
}
func sleep(for duration: TimeInterval) {
usleep(useconds_t(duration * Double(USEC_PER_SEC)))
}