简体   繁体   English

iOS迅速而循环循环冻结我的应用程序

[英]iOS swift while loop freeze my app

I'm developing an app where a user choose his accommodation and pick a time from date picker so the user can know what time the buss will arrive to his accommodation , on the simulator and iPad I'm having the appropriate results however I'm facing this issue on iPhone real device, this is the code : 我正在开发一个应用程序,用户可以选择住宿并从日期选择器中选择时间,以便用户可以知道公交车几点到达他的住宿,在模拟器和iPad上,我得到了适当的结果,但是在iPhone真实设备上面临此问题,代码如下:

mTimeString = "5:07 AM"

it will be searched in the array if not found , minus seconds until it matches results in the array . 如果未找到,它将在数组中搜索,直到与数组中的结果匹配之前减去几秒钟。 but while loop is freezing my app , i tried to surround it by : 但是虽然循环冻结了我的应用程序,但我尝试通过以下方式将其包围:

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

its not freezing anymore but the I'm not getting the results according to the array 它不再冻结,但我没​​有得到根据数组的结果

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)
    }
}

You are calculating on Background thread which is okay , but you should NEVER update UI element from background thread ( transportationLabel.text = mTimeString ) , this should be done from main Thread , for example 您正在计算后台线程,这是可以的,但是您永远不要从后台线程更新UI元素(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)
                }
            }
    }

Try replacing 尝试更换

transportationLabel.text = mTimeString

by 通过

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

UI operations must be executed from main thread UI操作必须从主线程执行

EDIT: 编辑:

In Swift: 在Swift中:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM