我使用jfiddle here:
搜索86,111个对象(实际上我在每个对象的UISearchController
属性中搜索)。
出于某种原因,当我开始在搜索栏上输入时,UI会冻结几秒钟,然后再次开始工作(例如,键盘冻结在一个字母上等)。
我认为这是因为我的用户界面真的很大 - 我能理解为什么它的搜索速度很慢,但我无法理解为什么它会冻结用户界面(isn&# 39;它在后台线程上搜索?)。
如果有人能够帮助我,我会非常高兴,
谢谢!
答案 0 :(得分:1)
您的实际搜索(通过所有对象)很可能发生在主线程上。 UISearchController
与线程无关,它允许程序员实现该部分,因此这就是您使用主线程进行搜索的原因。我不知道您是如何实现这一切的,但您应该使用dispatch_async
或NSOperationQueue
在后台线程上执行搜索。
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()
})
}