2017-01-10 1 views
1

У меня есть класс загрузчика, который загружает файл на основе заданного URL-адреса, который затем вызывает завершение передачи содержимого файла как NSData.Swift 3 - Загрузить изображение в формате JPEG и сохранить в файл - macOS

Для проекта, в котором я использую это, URL-адрес будет представлять собой изображение в формате JPEG. Загружатель работает отлично; Я могу использовать результат в NSImage и показать его в Image View Controller.

Я хочу, чтобы иметь возможность сохранить этот объект NSData в файл.

После некоторого времени изучения Интернета в Google, StackOverflow и т. Д., И многие попытки, я не могу получить файл для сохранения.

Вот площадка класса Downloader и моя попытка сохранить файл:

//: Playground - noun: a place where people can play 

import Cocoa 

class NetworkService 
{ 
    lazy var configuration: URLSessionConfiguration = URLSessionConfiguration.default 
    lazy var session: URLSession = URLSession(configuration: self.configuration) 

    let url: NSURL 

    init(url: NSURL) 
    { 
     self.url = url 
    } 

    func downloadImage(completion: @escaping ((NSData) -> Void)) 
    { 
     let request = NSURLRequest(url: self.url as URL) 
     let dataTask = session.dataTask(with: request as URLRequest) { (data, response, error) in 
      if error == nil { 
       if let httpResponse = response as? HTTPURLResponse { 
        switch (httpResponse.statusCode) { 
        case 200: 
         if let data = data { 
          completion(data as NSData) 
         } 
        default: 
         print(httpResponse.statusCode) 
        } 
       } 
      } else { 
       print("Error download data: \(error?.localizedDescription)") 
      } 
     } 
     dataTask.resume() 
    } 

} 

let IMAGE_URL = NSURL(string: "https://www.bing.com/az/hprichbg/rb/RossFountain_EN-AU11490955168_1920x1080.jpg") 

let networkService = NetworkService(url: IMAGE_URL!) 

networkService.downloadImage(completion: { (data) in 

    data.write(to: URL(string: "file://~/Pictures/image.jpg")!, atomically: false) 

}) 

Игровой площадку консольного шоу вообще ничего. Может ли кто-нибудь понять, почему он не работает?

ПРИМЕЧАНИЕ: Цель macOS, а не iOS. Кроме того, я скорым нуб ...

я попробовать это:

networkService.downloadImage(completion: { (imageData) in 
    let imageAsNSImage = NSImage(data: imageData as Data) 
    if let bits = imageAsNSImage?.representations.first as? NSBitmapImageRep { 
     let outputData = bits.representation(using: .JPEG, properties: [:]) 
     do { 
      try outputData?.write(to: URL(string: "file://~/Pictures/myImage.jpg")!) 
     } catch { 
      print("ERROR!") 
     } 
    } 

}) 
+0

я наткнулся, что один и пытался, но у меня был тот же самый результат. Файл image.jpg не был создан .... Редактирование выше, чтобы показать попытку ... – Johnno13

+0

Я отозвал свой закрытый голос. –

ответ

0

Это может быть разрешение вопроса. Вы можете попробовать:

let picturesDirectory = FileManager.default.urls(for: .picturesDirectory, in: .userDomainMask)[0] 
let imageUrl = picturesDirectory.appendingPathComponent("image.jpg", isDirectory: false) 
try? data.write(to: imageUrl) 

Это делает работу для меня: enter image description here

+1

Просто попробовал это на детской площадке. Еще не создан файл image.jpg. – Johnno13

+0

@ Игровая площадка Johnno13 песочница, вам нужно проверить ее в реальном проекте –

+0

* facepalm * -data.write() не работал в фактическом проекте, но вышеупомянутый способ сделал. – Johnno13

Смежные вопросы