Как правильно использовать защитное заявление с RxSwift Singles? - PullRequest
1 голос
/ 11 марта 2019

Представьте, что у меня есть сетевой клиент, использующий RxSwift для переноса URLSession.

Я хотел бы использовать оператор guard и вернуть ошибку, однако я получаю ошибку, которая

Не пустая функция должна возвращать значение

Это имеет смысл, однако я не уверен, как справиться с этим с помощью RxSwift.

class NetworkClient {
    var task: URLSessionDataTask = URLSessionDataTask()
    var session: SessionProtocol = URLSession.shared
    var request: URLRequest?

    func call<T: Codable>(_ request: URLRequest) -> Single<T> {
        return Single<T>.create(subscribe: { [weak self] observer -> Disposable in
            guard let `self` = self else { observer(.error(NSError(domain: "", code: 0, userInfo: [:]))); return }
            self.task = self.session.dataTask(with: request, completionHandler: { data, response, error in

            })


            return Disposables.create {
                self.task.cancel()
            }
        })
    }

}

1 Ответ

1 голос
/ 12 марта 2019

Просто используйте:

guard let `self` = self else { observer(.error(NSError(domain: "", code: 0, userInfo: [:]))); return Disposables.create() }

Однако я должен сказать, что я вообще не фанат класса. Во-первых, RxSwift уже имеет оболочку для dataTask:

func response(request: URLRequest) -> Observable<(response: HTTPURLResponse, data: Data)>

, который можно вызвать по:

URLSession.shared.rx.response(request: myRequest)

Также есть data(request:), который проверит код состояния и выдаст ошибку, если его нет в 200-х.

Вы можете просто внедрить функцию вместо того, чтобы добавить сложность ее оборачивания в объект, который не имеет добавленной стоимости. Например:

struct MyViewModel {
    init(serverResponse: @escaping (URLRequest) -> Observable<Data>)...
}

Который может быть вызван:

let myViewModel = MyViewModel(serverResponse: URLSession.shared.rx.data)

При тестировании вы можете просто передать закрытие, которое возвращает Observable<Data>.just(myTestData).

...