[Swift] 如何使用 RXAlamofire 下載檔案?

RxSwift 是目前很常用的第三方元件,Alamofire 則是很常見的網路服務元件,而 RXAlamofire 則是將 RxSwift 和 Alamofire 整合而成的一個套件。而我們如何使用 RXAlamofire 下載檔案呢?其實蠻簡單的唷!

swift 1

首先,我們先引入這個 extension,這是個將字串轉成網址的擴充,接下來的程式碼會用到。

public extension String {
    var url: URL? {
        URL(string: self)
    }
}

再來,我們就來下載檔案囉,只要使用 RxAlamofire.download 這個函式就可以囉!

private func downloadJSONData(){
      
    let urlStr = "網址"
    guard let url = urlStr.url else {return}

    RxAlamofire.download(URLRequest(url: url)) { URL, HTTPURLResponse in
      let docsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
      let filename = "/Download/download.json" //要儲存的檔名,可以含路徑
      let fileURL = docsURL.appendingPathComponent(filename)
      return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
    }
    .subscribe(onCompleted: {[weak self] in
          _ = self?.readJSONData() // 下載完成,解析 JSON 檔案
          print("Download complete")
      }
    )
    .disposed(by: disposeBag)
}

而如何解析 JSON 檔案呢,其實也很簡單,這裡有使用到 SwiftyJSON 這個套件,幫助我們來解析 JSON。

private func readJSONData() -> JSON{
    let docsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let filename = "/Download/download.json" //要開啟的檔名,可以含路徑
    let fileURL = docsURL.appendingPathComponent(filename)
    guard let data = try? Data(contentsOf: fileURL) else{
        return nil
    }
    return try? JSON(data: data)
}

是不是相當容易呢?如果有在用 RxSwift 的朋友,不可以錯過,如果沒在用 RxSwift 的同學,也可以利用這個方式下載檔案

發表迴響