UISearchController 使 UI 冻结
UISearchController makes UI freeze
我正在使用 UISearchController
在包含 86,111 个对象的数组中进行搜索(实际上我是在每个对象的 name
属性 中进行搜索)。
出于某种原因,当我开始在搜索栏上打字时,UI 会冻结几秒钟然后再次开始工作(例如,键盘冻结在一个字母上,等等)。
我认为这是因为我的 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中使用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()
})
}
我正在使用 UISearchController
在包含 86,111 个对象的数组中进行搜索(实际上我是在每个对象的 name
属性 中进行搜索)。
出于某种原因,当我开始在搜索栏上打字时,UI 会冻结几秒钟然后再次开始工作(例如,键盘冻结在一个字母上,等等)。
我认为这是因为我的 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中使用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()
})
}