UISearchController使UI冻结

时间:2016-04-09 06:01:43

标签: ios objective-c iphone cocoa-touch uisearchcontroller

我使用jfiddle here: 搜索86,111个对象(实际上我在每个对象的UISearchController属性中搜索)。

出于某种原因,当我开始在搜索栏上输入时,UI会冻结几秒钟,然后再次开始工作(例如,键盘冻结在一个字母上等)。

我认为这是因为我的用户界面真的很大 - 我能理解为什么它的搜索速度很慢,但我无法理解为什么它会冻结用户界面(isn&# 39;它在后台线程上搜索?)。

如果有人能够帮助我,我会非常高兴,

谢谢!

2 个答案:

答案 0 :(得分:1)

您的实际搜索(通过所有对象)很可能发生在主线程上。 UISearchController与线程无关,它允许程序员实现该部分,因此这就是您使用主线程进行搜索的原因。我不知道您是如何实现这一切的,但您应该使用dispatch_asyncNSOperationQueue在后​​台线程上执行搜索。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   //Code to perform the search
   dispatch_async(dispatch_get_main_queue(), ^{
      //Set the results of the search in the UI
   });
});

请参阅this关于在线程之间切换的答案。

答案 1 :(得分:0)

我认为您可以使用GCD(Grand Central Dispatch)在后台线程中执行搜索。然后,您可以将更新UI的代码部分移动到dispatch_async块中,因为UI更新应该在主线程中完成。

如果你在swift中使用调度队列,你可以编写这样的代码。

let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)   

dispatch_async(queue) { () -> Void in

    let resultArray = Search()

    dispatch_async(dispatch_get_main_queue(), {
        UI_Update()
    })
}

如果您使用NSOperation队列,我认为此代码将起作用。

queue = NSOperationQueue()

queue.addOperationWithBlock { () -> Void in

    let resultArray = Search()

    NSOperationQueue.mainQueue().addOperationWithBlock({
        UI_Update()
    })
}