Вам нужно использовать dataTask URLSession (с: URL) внутри метода main () класса Operation? - PullRequest
1 голос
/ 28 мая 2020

Нужно ли вам использовать dataTask URLSession (с: URL) внутри метода main () класса Operation? Например:

class Downloader: Operation {

    let postDetailsPage: PostDetailsPage

    init(_ postDetailsPage: PostDetailsPage) {
        self.postDetailsPage = postDetailsPage
    }

    override func main() {

        if isCancelled {
            return
        }

        let url = URL(string: "https://someurl.json")!
        NetworkingClient.shared.urlSession.dataTask(with: url) { (jsonData, response, error) in
            // work with jsondata
        }.resume()
    }
}

Если вышеупомянутая операция все равно будет выполняться в фоновой очереди операций, не использование dataTask (с: url) внутри метода main () просто излишне? В учебнике Рэя Вендерлиха по операциям они указывают загрузку данных следующим образом (см. # 5):

class ImageDownloader: Operation {
  //1
  let photoRecord: PhotoRecord

  //2
  init(_ photoRecord: PhotoRecord) {
    self.photoRecord = photoRecord
  }

  //3
  override func main() {
    //4
    if isCancelled {
      return
    }

    //5
    guard let imageData = try? Data(contentsOf: photoRecord.url) else { return }

    //6
    if isCancelled {
      return
    }

    //7
    if !imageData.isEmpty {
      photoRecord.image = UIImage(data:imageData)
      photoRecord.state = .downloaded
    } else {
      photoRecord.state = .failed
      photoRecord.image = UIImage(named: "Failed")
    }
  }
}

, но в документации Apple он указывает никогда использовать Data(contentsOf: url) для загрузки данных:

enter image description here

Является ли Data(contentsOf: url) безопасным способом загрузки данных из операции, которая будет выполняться асинхронно на все равно очередь операций (и точно не будет вызываться в одноразовом блоке)?

...