2017-02-24 11 views
0

私はボタンをクリックして私の電話にビデオをダウンロードしようとしています。iOSのビデオロケールをダウンロードしようswift

I「次を使用してメートル:任意の成功なし

@IBAction func startDownload(_ sender: AnyObject) { 
    let videoImageUrl = "http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4" 

    dispatch_async.global(DispatchQueue.(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
     let url = NSURL(string: videoImageUrl); 
     let urlData = NSData(contentsOfURL: url! as URL); 
     if(urlData != nil) 
     { 
      let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .userDomainMask, true)[0]; 
      let filePath="\(documentsPath)/tempFile.mp4"; 
      dispatch_async(DispatchQueue.main, { 
       urlData?.writeToFile(filePath, atomically: true); 
       PHPhotoLibrary.sharedPhotoLibrary().performChanges({ 
        PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(NSURL(fileURLWithPath: filePath)) 
       }) { completed, error in 
        if completed { 
         print("Video is saved!") 
        } 
       } 
      }) 
     } 
    }) 

} 

私は 'タイプの引数リスト(INT、INT)と 'グローバル' を呼び出すことはできません' を有するよ

PHPhotoLIbraryとPHAssetChangeRequestため

と未解決の識別子

は誰がどのようにこの仕事ができる知っているだろうしていますか?

どうもありがとう:)

- 編集 - あなたのコードと間違っていくつかのものがあります

@IBAction func startDownload(_ sender: UIButton) { 
    let videoImageUrl = "https://my-video.mp4" 


    DispatchQueue.global(qos: .default).async { 
     let url = NSURL(string: videoImageUrl); 
     let urlData = NSData(contentsOf: url! as URL); 
     if(urlData != nil) 
     { 
      let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]; 
      let filePath="\(documentsPath)/tempFile.mp4"; 
      DispatchQueue.main.async { 
       urlData?.write(toFile: filePath, atomically: true); 
       PHPhotoLibrary.shared().performChanges({ 
        PHAssetChangeRequest.creationRequestForAssetFromVideo(atFileURL: NSURL(fileURLWithPath: filePath) as URL) 
       }) { completed, error in 
        if completed { 
         print("Video is saved!") 
        } 
       } 
      } 
     } 
    } 
} 
+0

これはSwift 2かSwift 3ですか?それは2つの組み合わせのように見えます... – deadbeef

+0

私はそれをswift3で動作させようとしています、私はswift2からコードを元々持っています..... – tibewww

+0

http://stackoverflow.com/a/35510812/2303865 –

答えて

0

最初にディスパッチキューを使用する方法。バックグラウンドキューの 正しい方法は次のとおりです。

DispatchQueue.global(qos: .default).async { 
    // Code ... 
} 

やメインキューのために:

DispatchQueue.main.async { 
    // Code ... 
} 

第二に、Photosフレームワークを使用するためには、あなたはそれをインポートする必要があります。ファイルの先頭にimport Photosを追加します。

第三には、スウィフト3のいくつかのAPIの変更はありますが、コンパイラが(例えば、あなたが、どこでもないNSURLNSDataURLDataを使用する必要があります)自動修正彼らに提供する必要があります。 >Convert - - また、あなたがEditに行くことによってスウィフト3プロジェクトにスウィフト2プロジェクトを変換することができます>To Current Swift Syntax

そして最後に、あなたがあなたの動画をダウンロードする方法が間違っている、それは完全に保存される前にメモリにロードされますディスクに保存します。ビデオが大きくなると、問題が発生します。直接ファイルにダウンロードする方法については、URLSession APIを参照してください。

+0

こんにちはありがとう、コードが動作しています! それ以外の場合は、ボタンをクリックしても何も変わらず、アプリがフリーズします。 。 URLSession APIのidはduですか? 私はビデオが一時的に格納されている場所から再生することができるように、写真ライブラリにではなく、アプリケーション内にストックしたいと思います。それを達成する方法はありますか? – tibewww

関連する問題