我使用UISearchController
搜索86111个对象(其实我正在搜索每个对象的name
属性)。UISearchController使UI冻结
由于某些原因,当我在搜索栏上开始键入时,UI会冻结几秒钟,然后再次开始工作(例如,键盘会冻结一个字母等)。我认为这是因为我的用户界面真的很大 - 我可以理解为什么它搜索速度很慢,但我不明白为什么它冻结用户界面(不是它在后台线程上搜索?)。
如果有人能帮助我,我会非常开心,
谢谢!
我使用UISearchController
搜索86111个对象(其实我正在搜索每个对象的name
属性)。UISearchController使UI冻结
由于某些原因,当我在搜索栏上开始键入时,UI会冻结几秒钟,然后再次开始工作(例如,键盘会冻结一个字母等)。我认为这是因为我的用户界面真的很大 - 我可以理解为什么它搜索速度很慢,但我不明白为什么它冻结用户界面(不是它在后台线程上搜索?)。
如果有人能帮助我,我会非常开心,
谢谢!
很可能您的实际搜索(通过您的所有对象)发生在主线程上。 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关于在线程之间切换的答案。
我想你可以使用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()
})
}
我试过在我的'searchResults'数组的setter上使用'NSOperationQueue',但是我怎样才能在后台线程上返回数组呢? –
* getter - 我的不好 –
我试着在我的'searchResults'数组的setter上使用'NSOperationQueue',但是我怎么能''返回'在后台线程上的数组? –
如果你使用'NSOperationQueue',你可以使用'[NSOperationQueue mainQueue]''在主体上运行代码。我也用'dispatch_async'更新了我的答案,我用了一些基本示例。 – Jelly
是的,我知道,但是当调用searchResults的getter(我使用'NSPredicate'过滤数组)时,我需要返回数组,但是如果它在后台线程上,我怎样才能返回正确的和更新的数组? –