UISearchController 使 UI 冻结

UISearchController makes UI freeze

我正在使用 UISearchController 在包含 86,111 个对象的数组中进行搜索(实际上我是在每个对象的 name 属性 中进行搜索)。

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

我认为这是因为我的 UI 真的很大 - 我能理解为什么它搜索很慢,但我不明白为什么它会冻结 UI(它不是在搜索后台线程?)。

如果有人能帮助我,我会很高兴,

谢谢!

很可能您的实际搜索(通过所有对象)发生在主线程上。 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 关于在线程之间切换的回答。

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

如果你在swift中使用dispatch queue,你可以这样写代码。

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