В моем приложении мне нужно загрузить JSON файл из Интернета. Я сделал класс ResourceService
, у которого есть метод download
, как показано ниже. Я использую эту услугу в услугах "более высокого уровня" своего приложения. Вы можете видеть, что во время загрузки много ошибок. Сервер может загореться и не сможет успешно реагировать на данный момент, во время перемещения временного файла может произойти что-то не так.
Теперь, вероятно, мало что может сделать пользователь, кроме как попробовать позже. Однако он, вероятно, хочет знать, что что-то не так и что загрузка или поведение методов "более высокого уровня" не могут быть успешными.
Меня как разработчика путают как этот пункт, потому что я не понимаю, как справляться с ошибками в Swift. У меня есть completionHandler
, который принимает ошибку, если он есть, но я не знаю, какую ошибку я должен передать обратно вызывающему.
Мысли:
1) Если я передам объекты ошибки, которые я получаю из API NSFileManager или API NSURLSession, я бы подумал, что я "утечка" некоторой части метода download
для вызывающих. И как бы вызывающий абонент знал, какие ошибки ожидать от ошибки? Это может быть и то и другое.
2) Если я должен поймать и обернуть те ошибки, которые могут произойти внутри метода download
, как это будет выглядеть?
3) Как я могу работать с несколькими источниками ошибок внутри метода, и как выглядит код, вызывающий метод, который может вызывать/возвращать объекты NSError?
Если вы, как вызывающий, начинаете перехватывать ошибки, которые вы возвращаете, а затем записываете много кода, который отличает сообщения/действия, принятые на основе кода ошибки? Я вообще не получаю эту обработку ошибок и как это будет выглядеть, когда есть много вещей, которые могут пойти не так, как в одном методе.
func download(destinationUrl: NSURL, completionHandler: ((error: NSError?) -> Void)) {
let request = NSURLRequest(URL: resourceUrl!)
let task = downloadSession.downloadTaskWithRequest(request) {
(url: NSURL?, response: NSURLResponse?, error: NSError?) in
if error == nil {
do {
try self.fileManager.moveItemAtURL(url!, toURL: destinationUrl)
} catch let e {
print(e)
}
} else {
}
}.resume()
}