Swift - Запланированный таймер не срабатывает, как ожидалось - PullRequest
0 голосов
/ 01 октября 2018

Я определил и запустил запланированный таймер с интервалом времени 0,1 секунды (что означает 10 раз в секунду) и установил селектор в функцию, которая вызывает обработчик завершения VNDetectFaceLandmarksRequest.

Это работает, как и ожидалось, на iPhone 6s и iPhone 7. Однако при тестировании на iPad mini 2 запрос будет вызываться только 1 раз в секунду.

Это потому, что iPad mini 2 слишком стар и не имеет достаточного системного ресурса для его частого вызова или по каким-то другим причинам?

Ниже приведен соответствующий код:

var handler: VNImageRequestHandler?
var request: VNDetectFaceLandmarksRequest?    

faceTrackingTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(self.callHandler), userInfo: nil, repeats: true)   
faceTrackingTimer.fire()

// This is called about 30 times per second (frame capturing rate)
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    guard let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
    handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: .right, options: [:])
    request = VNDetectFaceLandmarksRequest { (request, error) in
    guard let results = request.results as? [VNFaceObservation] else { return }
        // process results here
    }
}

// Problem: this is called ONLY ONCE PER SECOND    
@objc func callHandler() {
    print("Will call handler ", Date()) 
    do {
    guard let handler = handler, let request = request else { return }
        try handler.perform([request])
    } catch let requestError {
        print(requestError.localizedDescription)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...