承诺+ Alamofire确保网络通话始终在后台

时间:2019-08-23 08:35:40

标签: swift alamofire promisekit

promise是否总是在后台线程上运行。

@IBAction func doNetworkCall(_ sender: Any) { // Does this run on 
     background thread
        Network.fetchPhotos().done { (photos) in

        }
    }

static func fetchPhotos () -> Promise<[Photo]> {
        return Promise { seal in
            AF.request("https:photosURL", method: .post, parameters: ["auth":"1231","user_id":"u12312"]).responseJSON { (response) in
                guard let data = response.data else { return }
                let coder  = JSONDecoder()
                let photos = try! coder.decode([Photo].self, from: data)
                seal.fulfill(photos)
            }
        }

    }

我使用了promise,目的是所有网络调用都在后台线程上运行,而不管是从主线程调用。我有一些连锁网络请求,这些请求将更易于实现。

这个假设正确吗?

1 个答案:

答案 0 :(得分:0)

Alamofire始终在后台队列上运行其请求。在您的示例中,唯一不在后台的部分是responseJSON闭包。默认情况下,闭包在.main队列上运行。我建议您采用responseDecodable来解码您的响应,以使解析也仅在后台调用时才能实现闭包中的promise。 (我不确定是否有必要在主队列中执行任务。)