У меня есть цепочка функций (иногда 3 цепочки функций, а иногда и 4-5), а это значит, что мне придется передавать блоки завершения каждой функции. Я пытаюсь выяснить, есть ли лучший способ вернуть результат и ошибки закрытия внутри функции.
Кстати, я здесь использую MSGraph API.
Код — функции запроса:
Код: Выделить всё
private func processRequest(_ request: NSMutableURLRequest, completion: @escaping(Data?, URLResponse?, Error?) throws -> ()) rethrows {
let dataTask: MSURLSessionDataTask = httpClient.dataTask(with: request, completionHandler: { (data, response, error) in
if let response = response as? HTTPURLResponse {
let statusCode = response.statusCode
if (statusCode < 200) || (statusCode > 299) {
let description = "Microsoft Graph service returned HTTP response status \(statusCode) for URL \(request.url?.absoluteString ?? "")"
let error = NSError(code: statusCode, localizedDescription: description)
try? completion(nil, nil, error)
}
}
if let error = error {
try? completion(nil, nil, error)
}
try? completion(data, response, nil)
})
dataTask.execute()
}
private func processRequestWithToken(_ request: NSMutableURLRequest, completion: (Data?, URLResponse?) -> ()) async throws {
try await MicrosoftAccount.acquireToken()
try processRequest(request) { (data, response, error) in
if let error = error {
throw error
}
completion(data, response)
}
}
Эти функции ниже выдают ошибку – невозможно преобразовать значение типа {'Bool' или '[MSGraphEvent]'} для типа результата закрытия '()', очевидно, потому что я не возвращаю блок завершения.
Код: Выделить всё
public func cancelBooking(eventId: String) async throws -> Bool {
let request = makeRequest(relativeUrl: "/me/events/\(eventId)/cancel", httpMethod: "POST")
addStandardRequestHeaders(to: request)
self.processRequestWithToken(request) { data, response in
if let response = response as? HTTPURLResponse, response.statusCode == 202 {
return true
} else {
return false
}
}
}
public func getEvents(selectedDate: Date?) async throws -> [MSGraphEvent] {
var api = "/me/calendar/events?"
let request = self.makeRequest(relativeUrl: api, httpMethod: "GET")
self.processRequestWithToken(request) { data, response in
let events: [MSGraphEvent] = try self.parseCollection(data: data)
return events
}
}
Есть ли лучший способ распространения результатов по цепочке функций без передачи блока завершения в качестве параметров для каждой функции?
Подробнее здесь: https://stackoverflow.com/questions/790 ... a-function
Мобильная версия