2016-09-24 2 views
7

Я пытаюсь взять/записать видео асинхронно в основном потоке. Однако, когда я называю dispatch.main.async, я всегда получаю ошибку:dispatchqueue в swift 3 появляется как неразрешенный идентификатор

use of unresolved identifier DispatchQueue 

Я смотрел везде от WWDC в документации Apple, но я не вижу доказательств такого типа не устарела.

Вот код:

if !self.cameraEngine.isRecording { 
      if let url = CameraEngineFileManager.temporaryPath("video.mp4") { 
       self.cameraButton.setTitle("stop recording", forState: []) 
       self.cameraEngine.startRecordingVideo(url, blockCompletion: { (url: NSURL?, error: NSError?) -> (Void) in 
        if let url = url { 

         DispatchQueue.main.async { 
          self.cameraButton.setTitle("start recording", for: .normal) 
          CameraEngineFileManager.saveVideo(url, blockCompletion: { (success: Bool, error: Error?) -> (Void) in 
           if success { 
            let alertController = UIAlertController(title: "Success, video saved !", message: nil, preferredStyle: .alert) 
            alertController.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil)) 
            self.present(alertController, animated: true, completion: nil) 
           } 
          }) 
         } 
        } 
       }) 
      } 
     } 
     else { 
      self.cameraEngine.stopRecordingVideo() 
     } 
    } 

ответ

0

Я думаю, что вы не один из них в списке рамок. Попробуйте импортировать один из них и попробуйте поставить DispatchQueue в свой файл.

import Foundation 
import UIKit 
// Any System Framework 

Это может произойти, если ваш файл не является Swift файл, или файл является Swift файл, но у вас нет каких-либо рамок на самом верху.

+1

я импортировал как SDKs в моем проекте, однако проблема все еще сохраняется – NightHawk95

7

Вы можете либо поместить

import Foundation 

или

import Dispatch 

в начале вашего кода, чтобы начать использовать DispatchQueue класс без любого вопроса.

+0

импорт диспетчерское сделал это для меня. Кстати, я запускал свой код в IBM Swift Sandbox ... Спасибо! –

+2

'import Dispatch' работает на Ubuntu –

3

Поддавки вот эта строка:

self.cameraButton.setTitle("stop recording", forState: []) 

Это не Swift 3. Поэтому ваш файл является файлом Swift 2.3. Поэтому нет такой вещи, как DispatchQueue. Вы должны использовать

dispatch_async(dispatch_get_main_queue()) { ... 
+0

OP, вероятно, лучше переписывает свой код, чтобы быть совместимым с Swift 3. На данный момент, вероятно, нет необходимости изучать Swift 2.3, поскольку он в значительной степени устарел и, вероятно, не так много кода, которое потребует его. – Gino

+0

И, на самом деле, ответ мата немного запутанный/вводящий в заблуждение, поскольку он представляет решение Swift 2.3. Лучшее, более долговременное решение было бы превратить код 2.3 в код 3.x. Нет смысла поддерживать устаревшую версию Swift, идущую вперед. Когда я прочитал ответ мата, я сначала подумал, что мне нужно изучить этот синтаксис dispatch_async, когда на самом деле DispatchQueue был уже лучшим и новым синтаксисом .. – Gino