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 回限りのブロックで呼び出されることはありません) 。