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.

Vinculando el modelo de vista y la fuente de datos con diferencias.

Quiero eliminar el objeto de la instantánea usando el deslizamiento para eliminar, pero primero necesito hacer una llamada de red que se encuentra en el modelo de vista. Si el resultado es exitoso, entonces elimino el objeto, de lo contrario no hago nada.

Estoy usando una clase de modelo de vista personalizada para obtener datos y agregar secciones e ítems, y también preferiría que el modelo de vista maneje todas las llamadas de red. Poner la llamada de red en tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) no es una opción.

Esto es un ejemplo:

“`
import UIKit

struct MySectionType: Hashable {}

struct MyItemType: Hashable {}

class MyViewModel {
func deleteItem(item: MyItemType) {
// Llamada de red…
}
}

class MyViewController: UIViewController {
var viewModel: MyViewModel

<pre><code>// MARK: – Inicialización
init?(coder: NSCoder, viewModel: MyViewModel) {
self.viewModel = viewModel
super.init(coder: coder)
}

required init?(coder: NSCoder) {
fatalError("init(coder:) no ha sido implementado")
}

class DataSource: UITableViewDiffableDataSource<mysectiontype, myitemtype=""> {
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
return true
}

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
if let item = itemIdentifier(for: indexPath) {
// Llamar a viewModel.deleteItem(item: item)

// Si es exitoso – deleteItems
var snapshot = self.snapshot()
snapshot.deleteItems([item])
apply(snapshot)
}
}
}
}
</code></pre>

}
“`</mysectiontype,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para eliminar un objeto de la instantánea utilizando el deslizamiento para eliminar, puede llamar al método deleteItems de la instantánea con el artículo a eliminar envuelto en un arreglo como parámetro. Sin embargo, dado que necesita hacer primero una llamada de red y solo eliminar el artículo si el resultado es exitoso, puede llamar al método deleteItem en el modelo de vista en su lugar. Aquí hay una implementación de ejemplo:

    1. Primero, actualice el método deleteItem en el modelo de vista para incluir un controlador de finalización que se llamará una vez que finalice la llamada de red:
      class MyViewModel {
         func deleteItem(item: MyItemType, completion: @escaping (Bool) -> Void) {
             // Llamada de red...
             // Si es exitoso
             completion(true)
             // Si falla
             completion(false)
         }
      }
      
    2. En el método commit editingStyle del origen de datos diferenciable, llame al método deleteItem en el modelo de vista y pase el controlador de finalización como parámetro:
      override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
         if editingStyle == .delete {
             if let item = itemIdentifier(for: indexPath) {
                 // Llamar al método deleteItem del viewModel
                 viewModel.deleteItem(item: item) { success in
                     if success {
                         // Si es exitoso - deleteItems
                         var snapshot = self.snapshot()
                         snapshot.deleteItems([item])
                         apply(snapshot)
                     }
                     // Si falla - no hacer nada
                 }
             }
         }
      }
      

    Al llamar al método deleteItem en el modelo de vista y pasar el controlador de finalización, puede asegurarse de que la operación de eliminación solo ocurra si la llamada de red es exitosa. Esto también mantiene la lógica empresarial separada de la lógica de la interfaz de usuario, siguiendo el patrón de arquitectura Modelo-Vista-ViewModel (MVVM).

Comments are closed.