1

Operation クラスの main() メソッド内で URLSession の dataTask(with: URL) を使用する必要がありますか? 例えば:

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()
    }
}

上記の操作がとにかくバックグラウンド操作キューで実行される場合、main() メソッド内で dataTask(with:url) を使用するのはやり過ぎではありませんか? Operations に関する Ray Wenderlich チュートリアルでは、次のようにデータのダウンロードを指定しています (#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")
    }
  }
}

しかし、アップルのドキュメントData(contentsOf: url)では、データのダウンロード には決して使用しないように指定されています。

ここに画像の説明を入力

Data(contentsOf: url)とにかく操作キューで非同期に実行される操作内からデータをダウンロードする安全な方法はありますか (そして、1 回限りのブロックで呼び出されることはありません) 。

4

0 に答える 0