2016-05-25 15 views
0

現在、私はAlamofireをネットワークリクエストに使用しています。 PHPhotoLibraryPhotos.framework)を使用して既に存在するフォトアルバムに画像を直接ダウンロードするにはどうすればよいですか?画像を直接フォトアルバムにダウンロード

P .:私自身NSURLSessionを使用して解決策を用意しても構いません。

注意事項:ファイルを一時的にディスクに保存することはできません。 Photos.frameworkを使用して、データをメモリに保存してディスクに保存します。

答えて

0

私はそれを自分で考え出します。 NSURLSessionからdataTaskWithRequestで実装しました。

当初私はNSData(contentsOfURL:)を使用していましたが、contentsOfURLメソッドは、ファイル全体が転送されるまで返されません。大容量のコンテンツを読み込んでいてデバイスの接続が遅い場合は、UIがブロックされるため、ローカルファイルにのみ使用し、リモートファイルには使用しないでください。

// Avoid this! 
let originalPhotoData = NSData(contentsOfURL: NSURL(string: "http://photo.jpg")!) 

したがって、データタスクを使用してNSDataにコンテンツをロードすることは可能です。 1つの解決策は、次のようになります。

let request = NSMutableURLRequest(URL: NSURL(string: urlString.URLString)!) 
request.allHTTPHeaderFields = [ 
    "Content-Type": "image/jpeg" 
] 
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
    if let e = error { 
     print(e.description) 
     return 
    } 
    guard let image = UIImage(data: data) else { 
     print("No image") 
     return 
    } 
    // Success 
    // Note: does not save into an album. I removed that code to be more concise. 
    PHPhotoLibrary.sharedPhotoLibrary().performChanges { 
     let creationRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(image) 
    }, completionHandler: { (success : Bool, error : NSError?) -> Void in 
     if success == false, let e = error){ 
      print(e) 
     } 
    } 
} 
task.resume() 

データは最終段階でのみ利用できますが、代わりにデータにアクセスしてセッションデリゲートを使用して進捗状況を確認できます。

class Session: NSObject, NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate { 

    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
    let queue = NSOperationQueue.mainQueue() 
    var session = NSURLSession() 

    var buffer = NSMutableData() 
    var expectedContentLength = 0 

    override init() { 
     super.init() 
     session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: queue) 
    } 

    func dataTaskWithRequest(request: NSURLRequest) -> NSURLSessionDataTask { 
     // The delegate is only called if you do not specify a completion block! 
     return session.dataTaskWithRequest(request) 
    } 

    func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveResponse response: NSURLResponse, completionHandler: (NSURLSessionResponseDisposition) -> Void) { 
     buffer = NSMutableData() 
     expectedContentLength = Int(response.expectedContentLength) 
     print("Expected content length:", expectedContentLength) 
     completionHandler(NSURLSessionResponseDisposition.Allow) 
    } 

    func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) { 
     buffer.appendData(data) 
     let percentageDownloaded = Float(buffer.length)/Float(expectedContentLength) 
     print("Progress: ", percentageDownloaded) 
    } 

    func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) { 
     print("Finished with/without error \(error)") 
     // Use the buffer to create the UIImage 
    } 

} 
関連する問題