Bolt-Swift: обработка ошибок - PullRequest
       6

Bolt-Swift: обработка ошибок

0 голосов
/ 27 августа 2018

Я хочу использовать BoltsSwift (https://github.com/BoltsFramework/Bolts-Swift).

Но я не могу правильно обрабатывать ошибки.

В следующем примере почему «taskHello2.continueOnSuccessWith» работает вместо «taskHello2.continueOnErrorWith»?

Спасибо

func testTask() {
    let taskHello1 = echo("hello1")
    let taskHello2 = taskHello1.continueOnSuccessWith(continuation: { (task) -> Task<String> in
        let taskResult = self.echo("error")
        return taskResult
    })
   _ = taskHello2.continueOnErrorWith(continuation: { (task) -> Task<String> in
        let taskResult = self.echo("Error received")
        return taskResult
    })
    _ = taskHello2.continueOnSuccessWith(continuation: { (task) -> Task<String> in
        let taskResult = self.echo("Success received")
        return taskResult
    })
}

func echo(_ text: String) -> Task<String> {
    let taskCompletionSource = TaskCompletionSource<String>()
    print("=> \(text)")
    switch (text) {
    case "error":
        let error = NSError(domain: "domain", code: -1, userInfo: ["userInfo": "userInfo"])
        taskCompletionSource.set(error: error)
    case "cancel":
        taskCompletionSource.cancel()
    default:
        taskCompletionSource.set(result: text)
    }
    return taskCompletionSource.task
}

выход:

=> hello1
=> error
=> Success received

1 Ответ

0 голосов
/ 28 августа 2018

Функция continueOnErrorWith(continuation:) запускается только при наличии ошибки - задание не выполнено.

В вашей функции testTask(), taskHello1 выполняется или выполняется успешно, и поэтому 'hello1' выводится на консоль.

В коде:

let taskHello2 = taskHello1.continueOnSuccessWith(continuation: { (task) -> Task<String> in
        let taskResult = self.echo("error")
        return taskResult
    })

, поскольку taskHello1 уже встретил успех , код внутри замыкания выполняется и 'error' печатается.

Внутренний код:

_ = taskHello2.continueOnErrorWith(continuation: { (task) -> Task<String> in
    let taskResult = self.echo("Error received")
    return taskResult
})

, поскольку taskHello2 имел не встретил ошибку , код внутри замыкания не выполняется и «Ошибка получена» не выводится на консоль.

Аналогично в коде:

_ = taskHello2.continueOnSuccessWith(continuation: { (task) -> Task<String> in
        let taskResult = self.echo("Success received")
        return taskResult
    })

, поскольку taskHello2 имел встретил успех , код внутри замыкания выполняется и 'Успех получен' .

...