2016-05-08 4 views
0

Я пытаюсь воспроизвести видео, загруженное с cloudkit. Я использую тот же метод запроса, который я использую для загрузки изображения:ios swift play video uploaded from cloudkit

publicData.performQuery(query, inZoneWithID: nil) { results, error in 
    if error == nil { // There is no error 
     for cafe in results! { 
      let newCafe = Cafe() 
      newCafe.address = cafe["address"] as? String 
      newCafe.name = cafe["name"] as? String 
      newCafe.email = cafe["email"] as? String 
      newCafe.description = cafe["description"] as? String 
      newCafe.location = cafe["location"] as? CLLocation 
      newCafe.cafeImage = cafe["cafeImage"] as? CKAsset 
      newCafe.offer_wifi = cafe["offer_wifi"] as? Bool 
      newCafe.smoking_area = cafe["smoking_area"] as? Bool 
      newCafe.cafeVideo = cafe["video"] as? CKAsset // <== I want to use this 
      self.cafes.append(newCafe) 
      let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults() 

      defaults.setInteger(self.cafes.count, forKey: "PreviousCafeCount") 


      dispatch_async(dispatch_get_main_queue(), {() -> Void in 
       self.tableView.reloadData() 
       Spinner.sharedLoader.hideLoading() 
      }) 

внутри cafeDetailViewController, я создаю кнопку, триггер, играя в видео с помощью AVPlayer. AVKit и AVFoundation уже импортированы.

@IBAction func playVideo(sender: AnyObject) { 
    if let file = cafeDetail.cafeVideo { 
     let player = AVPlayer(URL: file.fileURL) 
     let playerController = AVPlayerViewController() 

     playerController.player = player 
     self.addChildViewController(playerController) 
     self.view.addSubview(playerController.view) 
     playerController.view.frame = self.view.frame 

     player.play() 
    } 
} 

Однако результат: enter image description here

следить за вопрос: как я могу реализовать модель объединения в стрижа? Аналогично has_many и принадлежит к ассоциации в рельсах. Я не думаю, что загрузка всего видео заранее является хорошим решением.

ответ

0

Из того, что я вижу, вам нужно сохранить видео в локальном файле, а затем воспроизвести этот файл. Это изменено от того, что я написал, чтобы запутаться с CloudKit.

import UIKit 
    import CloudKit 
    import AVKit 
    import AVFoundation 

    class CloudKitTestViewController: UIViewController { 

    let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase 

    var videoURL: NSURL! 

    @IBAction func load(sender: AnyObject) { 

     let predicate = NSPredicate(format: "videoName = %@", "nameOfVideoGoesHere") 

     activityIndicator.startAnimating() 

     let query = CKQuery(recordType: "Videos", predicate: predicate) 

     publicDatabase.performQuery(query, inZoneWithID: nil) { (results, error) in 
      if error != nil { 
       dispatch_async(dispatch_get_main_queue()) { 
        self.notifyUser("Cloud Access Error", 
            message: error!.localizedDescription) 
       } 
      } else { 
       if results!.count > 0 { 
        let record = results![0] 

        dispatch_async(dispatch_get_main_queue()) { 
         !) 

         let video = record.objectForKey("videoVideo") as! CKAsset 

         self.videoURL = video.fileURL 

         let videoData = NSData(contentsOfURL: self.videoURL!) 

         let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] 
         let destinationPath = NSURL(fileURLWithPath: documentsPath).URLByAppendingPathComponent("filename.mov", isDirectory: false) 

         NSFileManager.defaultManager().createFileAtPath(destinationPath.path!, contents:videoData, attributes:nil) 

         self.videoURL = destinationPath 

         print(self.videoURL) 

        } 
       } else { 
        dispatch_async(dispatch_get_main_queue()) { 
         self.notifyUser("No Match Found", 
             message: "No record matching the address was found") 
        } 
       } 
      } 

      dispatch_async(dispatch_get_main_queue(), { 
       self.activityIndicator.stopAnimating() 
      }) 
     } 


    } 

    override func prepareForSegue(segue: UIStoryboardSegue, 
            sender: AnyObject?) { 
     let destination = segue.destinationViewController as! 
     AVPlayerViewController 
     let url = videoURL 
     print(videoURL) 
     destination.player = AVPlayer(URL: url!) 
    } 

} 
+0

благодарит! это полностью сработало. –