Inusual UITableView crash on – : index 0 beyond limits para array vacío

He buscado una tonelada y no he encontrado una respuesta que parezca solucionar el problema que estoy teniendo.

Tengo un UITableViewController. En el método viewDidLoad, cargo objects de una database y luego llamo a reloadData.

Ahora, en general, esto funciona bien. Sin embargo, ahora estoy implementando la sorting, que se mantiene para que se use el mismo algorithm de sorting en el próximo lanzamiento de la aplicación. Tenga en count que en todos los casos, el tamaño de la matriz que respalda la sección es el mismo después de la sorting.

Si utilizo el método de sorting pnetworkingeterminado, no me fallará, a pesar de que se ejecuta a través del mismo tipo> call delegate> reloadTable code path. Sin embargo, si utilizo un método de orderación alternativo, que utiliza la misma ruta de código, veo la vista de tabla pedir el número de filas y get el número correcto, pero luego obtengo esta exception. Solo los objects se orderan en un order diferente, así que esto no tiene sentido para mí.

También hay que tener en count que si ordero los objects (que usan la misma ruta de código) después de que se haya mostrado la tabla, funciona bien.

Esto no tiene sentido para mí, y casi parece un error de UITableView, pero espero que sea algo que pueda solucionar.

Mi aplicación es de código abierto, por lo que puedo vincular directamente a los files relevantes:

https://github.com/einsteinx2/iSub/blob/weird_crash/Classes/UI/Reusable/ItemViewController.swift https://github.com/einsteinx2/iSub/blob/weird_crash/Classes/UI/Reusable/ItemViewModel.swift

Los methods más relevantes son ItemViewModel.sortAll() y ItemViewController.itemsChanged(viewModel: ItemViewModel)

Me he quedado sin ideas sobre cómo depurar esto. Simplemente no tiene sentido.

Algunas cosas de testing y error que he probado:

  1. Usando solo una sección de la tabla
  2. Llamar a reloadData después de un retraso para descartar algún tipo de condición de carrera
  3. No se llama a reloadData en mi método de delegado itemsChanged (aún se cuelga, ya que el controller de vista de tabla parece llamar automáticamente a reloadData)

Nada parece hacer ninguna diferencia. Estoy completamente confundido sobre cómo esto podría ser posible. Si alguien tiene alguna idea sobre cómo puedo continuar depurando esto, o cómo puede ser posible, soy todo oídos. Gracias.

EDIT: para hacer las cosas más confusas, también he persistido en la sorting de álbumes, que usan el mismo ItemViewController, sin embargo, volver a un álbum que se orderó previamente no causa un locking, aunque debería estar haciendo exactamente lo mismo y ejecutar el misma ruta de código

¡Guau, finalmente lo descubrí y hablo de Case Edge!

Resulta que el locking tiene que ver con los índices de la sección de la tabla (las letras en el lado derecho), no con la carga o sorting de datos reales.

Estaba usando el carácter de viñeta unicode cuando no está orderado por nombre. De alguna manera, esto funcionó cuando orderaste en vivo, pero hay un error en UITableView que hace que la matriz interna de los índices de sección esté vacía cuando cargues la tabla con esos datos. Cambié a usar el carácter de círculo negro y ahora ya no se cuelga.

Creo que este debe ser el cambio más pequeño para la mayor cantidad de trabajo de investigación que he hecho en 8 años de encoding para iOS.

Espero que esto ayude a alguna persona random en el futuro. Informaré un error a Apple, aunque es probable que no sea de alta prioridad, así que quién sabe si lo arreglarán.