OSDN Git Service

Doutaku を 1.0 にアップデート
[kcd/KCD.git] / KCD / EnhancementListItemDownloader.swift
1 //
2 //  EnhancementListItemDownloader.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/12/22.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Foundation
10
11 final class EnhancementListItemDownloader: NSObject, URLSessionDownloadDelegate {
12     
13     private let resourceName: String
14     private let resourceExtension: String
15     
16     init(name: String, extension ext: String) {
17         
18         self.resourceName = name
19         self.resourceExtension = ext
20         
21         super.init()
22         
23         plistDownloadQueue = OperationQueue()
24         plistDownloadQueue.name = "StrengthenListViewControllerPlistDownloadQueue"
25         plistDownloadQueue.maxConcurrentOperationCount = 1
26         plistDownloadQueue.qualityOfService = .background
27         
28         let configuration = URLSessionConfiguration.default
29         
30         plistDownloadSession = URLSession(configuration: configuration,
31                                           delegate: self,
32                                           delegateQueue: plistDownloadQueue)
33     }
34     
35     private var plistDownloadSession: URLSession!
36     private var plistDownloadQueue: OperationQueue!
37     private var plistDownloadTask: URLSessionDownloadTask?
38     private var finishOperation: (([EnhancementListItem]) -> Void)?
39     
40     func download(completeHandler: @escaping ([EnhancementListItem]) -> Void) {
41         
42         if let _ = plistDownloadTask {
43             
44             return
45         }
46         
47         guard let plistURL = URL(string: "https://osdn.net/projects/kcd/scm/git/KCD/blobs/master/KCD/\(resourceName).\(resourceExtension)?export=raw") else {
48             
49             return
50         }
51         
52         finishOperation = completeHandler
53         plistDownloadTask = plistDownloadSession.downloadTask(with: plistURL)
54         plistDownloadTask?.resume()
55     }
56     
57     func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
58         
59         plistDownloadTask = nil
60         
61         guard let data = try? Data(contentsOf: location, options: []) else {
62             
63             return
64         }
65         guard let list = NSKeyedUnarchiver.unarchiveObject(with: data as Data) as? [EnhancementListItem] else {
66             
67             return
68         }
69         
70         finishOperation?(list)
71     }
72     
73     func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
74         
75         if let error = error {
76             
77             Logger.shared.log(error.localizedDescription)
78         }
79         plistDownloadTask = nil
80     }
81 }