2015-07-22 2 views
0

Я разрабатываю приложение, в котором пользователь выбирает свое жилье и выбирает время с даты выбора, чтобы пользователь мог знать, в какое время автобус прибудет в его жилье, на тренажере и iPad I «м, имеющий соответствующие результаты, однако я столкнулся этот вопрос на iPhone реальном устройстве, это код:iOS swift while loop freeze мое приложение

mTimeString = "5:07 AM" 

будет искаться в массиве, если не найден, минус секунд, пока он не совпадет результаты в массиве , но в то время как цикл замораживание моего приложения, я пытался окружить его:

let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT ,0) 
dispatch_async(queue){} 

его не замораживать больше, но я не получаю результаты по массиву

if(defaults.stringForKey(accommodationChoiceKey)?.toInt() == 40) { 

    var array = ["12:05 AM","12:25 AM","12:45 AM","1:05 AM","1:25 AM","1:45 AM","2:05 AM","2:25 AM","2:45 AM","3:05 AM","3:25 AM","3:45 AM","4:05 AM","4:25 AM","4:45 AM","5:05 AM","5:25 AM","5:45 AM","6:05 AM","6:25 AM","6:45 AM","7:05 AM","7:25 AM","7:45 AM","8:05 AM","8:25 AM","8:45 AM","9:05 AM","9:25 AM","9:45 AM","10:05 AM","10:25 AM","10:45 AM","11:05 AM","11:25 AM","11:45 AM","12:05 PM","12:25 PM","12:45 PM","1:05 PM","1:25 PM","1:45 PM","2:05 PM","2:25 PM","2:45 PM","3:05 PM","3:25 PM","3:45 PM","4:05 PM","4:25 PM","4:45 PM","5:05 PM","5:25 PM","5:45 PM","6:05 PM","6:25 PM","6:45 PM","7:05 PM","7:25 PM","7:45 PM","8:05 PM","8:25 PM","8:45 PM","9:05 PM","9:25 PM","9:45 PM","10:05 PM","10:25 PM","10:45 PM","11:05 PM","11:25 PM","11:45 PM"] 
    while (find(array, mTimeString) == nil) { 
     choiceToSeconds-- 
     var newmTime = x.dateByAddingTimeInterval(Double(choiceToSeconds)) 
     var mTimeString = dateFormatter.stringFromDate(newmTime) 
     if (find(array, mTimeString) != nil) { 
      transportationLabel.text = mTimeString 
      break 
     } 
     getReady(newmTime) 
    } 
} 
+0

спасибо @ Dániel Nagy – Nabzos

+0

Не famill iar с быстрым, но не сэкономит вам 59 итераций за минуту, если вы используете selectToSeconds * 60, потому что, насколько я знаю, датаByAddingTimeInterval использует секунды –

+0

Я пробовал это, все еще замораживая @SergeBekenkamp – Nabzos

ответ

2

Вы вычислительные на Фоновый поток, который в порядке, но вы никогда не должны обновить элемент пользовательского интерфейса от фонового потока (transportationLabel.text = mTimeString), это должно быть сделано из главного потока, например

let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT 
    dispatch_async(dispatch_get_global_queue(priority, 0)) { 

     if(defaults.stringForKey(accommodationChoiceKey)?.toInt() == 40) { 

       var array = ["12:05 AM","12:25 AM","12:45 AM","1:05 AM","1:25 AM","1:45 AM","2:05 AM","2:25 AM","2:45 AM","3:05 AM","3:25 AM","3:45 AM","4:05 AM","4:25 AM","4:45 AM","5:05 AM","5:25 AM","5:45 AM","6:05 AM","6:25 AM","6:45 AM","7:05 AM","7:25 AM","7:45 AM","8:05 AM","8:25 AM","8:45 AM","9:05 AM","9:25 AM","9:45 AM","10:05 AM","10:25 AM","10:45 AM","11:05 AM","11:25 AM","11:45 AM","12:05 PM","12:25 PM","12:45 PM","1:05 PM","1:25 PM","1:45 PM","2:05 PM","2:25 PM","2:45 PM","3:05 PM","3:25 PM","3:45 PM","4:05 PM","4:25 PM","4:45 PM","5:05 PM","5:25 PM","5:45 PM","6:05 PM","6:25 PM","6:45 PM","7:05 PM","7:25 PM","7:45 PM","8:05 PM","8:25 PM","8:45 PM","9:05 PM","9:25 PM","9:45 PM","10:05 PM","10:25 PM","10:45 PM","11:05 PM","11:25 PM","11:45 PM"] 
       while (find(array, mTimeString) == nil) { 
        choiceToSeconds-- 
        var newmTime = x.dateByAddingTimeInterval(Double(choiceToSeconds)) 
        var mTimeString = dateFormatter.stringFromDate(newmTime) 
        if (find(array, mTimeString) != nil) { 

         // This should be done on Main Thread 
         dispatch_async(dispatch_get_main_queue()) { 
          transportationLabel.text = mTimeString 
         }  


         break 
        } 
        getReady(newmTime) 
       } 
      } 
    } 
+0

получило ошибку на^...^не является префиксом унарного оператор – Nabzos

+0

да, похоже, что вы пропустили^перед тем, как открыть блок для dispatch_queue, и я просто скопировал его, теперь я его заменил, но основная часть - это метка, получающая – ogres

+0

ту же ошибку, но в начале – Nabzos

0

Попытка замены

transportationLabel.text = mTimeString 

по

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
    transportationLabel.text = mTimeString 
}]; 

операций пользовательского интерфейса должны быть выполнены из основного потока

EDIT:

В Swift:

NSOperationQueue.mainQueue().addOperationWithBlock({ 
    transportationLabel.text = mTimeString 
}) 
+0

это быстро[email protected] – Nabzos

+0

Извините, см. Мое редактирование для кода Swift –

+0

спасибо за скорость, но приложение не замерзает, но я не получаю результаты в соответствии с массивом – Nabzos