Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

swift ios как запустить анимацию во время вычислений

#ios #swift #loading


Со свифтом знакома меньше недели, так что извиняюсь, если вопрос слишком глупый,
но дело вот какое:

У меня есть контроллер, в котором я ввожу данные, клацаю на кнопку и перехожу к другому
контроллеру, в котором производятся вычисления и выводятся на экран. Все вычисления
прописаны во viewDidLoad второго контроллера, и если введенное значение слишком большое,
то они занимают много времени. И все это время экран зависает на первом контроллере.

Я хочу сделать так, чтобы пока производятся вычисления на экране была гифка, но вышло
так, что сначала все считается, потом включается гифка и тут же переход. (subView я
пробовала добавлять и в функцию кнопки и в функцию ShouldPerformSegue)
    


Ответы

Ответ 1



В методе viewDidLoad вам нужно выполнять вычисления в бекграунд потоке, а пока все это вычисляется, показывать анимацию, и как только все вычисления будут закончены, в completion блоке останавливать анимацию.

Ответ 2



Как уже было сказано, вам надо выполнять код на отдельном потоке. Скорее всего в результате вычислений сделанных в отдельном потоке, вам надо будет делать апдейт информации на экране. Помните, что это обязательно делать на mainThread, то есть после вычислений вам надо указать в программе, что вы хотите выполнить какой то код в основном потоке. Приведу несколько примеров как это сделать: dispatch_async(dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { () -> Void in //код, который надо выполнить асинхронно здесь dispatch_sync(dispatch_get_main_queue(), { () -> Void in //код, который должен выполниться в главном потоке }) } или override func viewDidLoad() { super.viewDidLoad() self.performSelectorInBackground(Selector("backgroundTask"), withObject: nil) } func backgroundTask () { //код, который надо выполнить асинхронно здесь self.performSelectorOnMainThread(Selector("anotherSelector"), withObject: nil, waitUntilDone: false) } или let opQueue: NSOperationQueue = NSOperationQueue() opQueue .addOperationWithBlock { () -> Void in //код, который надо выполнить асинхронно здесь NSOperationQueue.mainQueue() .addOperationWithBlock({ () -> Void in //код, который должен выполниться в главном потоке }) }

Комментариев нет:

Отправить комментарий