es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué usar `catch` de Combine podría causar una falla de segmentación?

Acabo de pasar demasiado tiempo intentando solucionar un error de segmentación 11 en una compilación de lanzamiento.

Al final, el cambio de código fue de esto…

fetchValue
    .receive(on: scheduler)
    .store(in: &subscriptions)
    .sink { [weak self] completion in
        switch completion {
        case .failure(let error):
            self?.state = .error(error.localizedDescription)
        case .finished:
            return
        }
    } receiveValue: { [weak self] value in
        self?.state = .someValue(value)
    }
    .store(in: &subscriptions)

a esto…

fetchValue
    .map(State.someValue)
    .catch { error in Just(State.error(error.localizedDescription)) }
    .receive(on: scheduler)
    .assign(to: \.state, on: self)
    .store(in: &subscriptions)

Y específicamente la línea catch estaba causando el problema.

En el código anterior, fetchValue se define como un Future<SomeValue, Error>.

Y self.state se define como un enum como…

enum State {
  case someValue(SomeValue)
  case error(String)
}

Se compilo para la depuración y la prueba sin ningún problema en absoluto.

Pero al compilar para el lanzamiento (archivo) con Xcode 13.0 y 13.1, causó un error de segmentación 11 y no tengo idea por qué?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    P: ¿Cuál fue el problema que causó una violación de segmento 11 en el código?

    R: El problema que causó una violación de segmento 11 en el código fue la línea catch en el segundo fragmento de código proporcionado.

    P: ¿Cuál fue la solución al problema?

    R: La solución al problema fue cambiar el método store al método assign y usar los métodos map y catch para manejar adecuadamente las devoluciones de llamada.

Comments are closed.