Перед началом отметьте, что это не имеет никакого отношения к фоновой обработке. Нет никакого "расчета", который можно было бы использовать.
Только UIKit.
view.addItemsA()
view.addItemsB()
view.addItemsC()
Скажем, на iPhone 6s
Для каждого из них требуется одна секунда для создания UIKit.
Это произойдет:
ОНИ ОТВЕРЖДАЮТ ВСЕ. Чтобы повторить, экран просто зависает в течение 3 секунд, в то время как UIKit выполняет огромную работу. Затем все они появляются сразу.
Но позвольте сказать, что я хочу, чтобы это произошло:
ОНИ ПРОДОЛЖАЮТСЯ. Экран просто висит в течение 1 секунды, в то время как UIKit строит один. Кажется. Он снова висит, когда он строит следующий. Кажется. И так далее.
(Примечание "одна секунда" - просто простой пример для ясности. См. конец этого сообщения для более полного примера.)
Как вы это делаете в iOS?
Вы можете попробовать следующее. Кажется, что это не работает.
view.addItemsA()
view.setNeedsDisplay()
view.layoutIfNeeded()
view.addItemsB()
Вы можете попробовать следующее:
view.addItemsA()
view.setNeedsDisplay()
view.layoutIfNeeded()_b()
delay(0.1) { self._b() }
}
func _b() {
view.addItemsB()
view.setNeedsDisplay()
view.layoutIfNeeded()
delay(0.1) { self._c() }...
-
Обратите внимание, что если значение слишком мало - , этот подход просто и, очевидно, ничего не делает. UIKit просто будет работать. (Что еще он мог бы сделать?). Если значение слишком велико, оно бессмысленно.
-
Обратите внимание, что в настоящее время (iOS10), , если я не ошибаюсь: если вы попробуете этот трюк с трюком нулевой задержки, он работает в лучшем случае беспорядочно. (Как вы, вероятно, ожидаете.)
Отключить цикл запуска...
view.addItemsA()
view.setNeedsDisplay()
view.layoutIfNeeded()
RunLoop.current.run(mode: .defaultRunLoopMode, before: Date())
view.addItemsB()
view.setNeedsDisplay()
view.layoutIfNeeded()
Разумный. Но наше недавнее тестирование в реальной жизни показывает, что во многих случаях это НЕ работает.
(т.е. Apple UIKit теперь достаточно сложна, чтобы смазать работу UIKit за пределами этого "трюка".)
Мысль: есть ли способ, в UIKit, получить обратный вызов, когда он, в основном, нарисовал все просмотренные вами взгляды? Есть ли другое решение?
Кажется, что одно из решений... поместит subviews в контроллеры, поэтому вы получаете обратный вызов "didAppear" и отслеживаете их. Это кажется инфантильным, но, может быть, это единственный шаблон? Будет ли это действительно работать? (Только одна проблема: я не вижу никакой гарантии, что didAppear гарантирует, что все подзаголовки будут нарисованы.)
Если это еще не ясно...
Пример повседневного использования:
• Скажите, что возможно семь разделов.
• Скажем, каждый из них обычно занимает от 0,01 до 0,20 для построения UIKit (в зависимости от того, какую информацию вы показываете).
• Если вы просто "пусть все идет в один удар" , это будет нормально или приемлемо (общее время, скажем от 0,05 до 0,15)... но...
• часто возникает утомительная пауза для пользователя, поскольку появляется "новый экран". (.1 до .5 или хуже).
• Если вы делаете то, о чем я прошу, он всегда будет сглаживать экран, по одному фрагменту за раз, с минимально возможным временем для каждого фрагмента.