Возврат результатов и выдача ошибок при закрытии внутри функцииIOS

Программируем под IOS
Ответить
Anonymous
 Возврат результатов и выдача ошибок при закрытии внутри функции

Сообщение Anonymous »

Я хочу выдавать ошибки и/или возвращать результаты запроса после закрытия. Я просмотрел несколько сообщений о SO и похоже, что люди в основном передают блоки завершения для передачи ошибки и результата вызывающей функции.
У меня есть цепочка функций (иногда 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
}
}
Функции CancelBooking и getEvents затем вызываются другой функцией. Если я верну им блок завершения, то я не вижу никаких ошибок и все работает нормально, но мне приходится передавать блок завершения каждой функции в цепочке.
Есть ли лучший способ распространения результатов по цепочке функций без передачи блока завершения в качестве параметров для каждой функции?

Подробнее здесь: https://stackoverflow.com/questions/790 ... a-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»