#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 //код, который должен выполниться в главном потоке }) }
Комментариев нет:
Отправить комментарий