2016-04-09 97 views
1

我使用UISearchController搜索86111个对象(其实我正在搜索每个对象的name属性)。UISearchController使UI冻结

由于某些原因,当我在搜索栏上开始键入时,UI会冻结几秒钟,然后再次开始工作(例如,键盘会冻结一个字母等)。我认为这是因为我的用户界面真的很大 - 我可以理解为什么它搜索速度很慢,但我不明白为什么它冻结用户界面(不是它在后台线程上搜索?)。

如果有人能帮助我,我会非常开心,

谢谢!

回答

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关于在线程之间切换的答案。

+0

我试着在我的'searchResults'数组的setter上使用'NSOperationQueue',但是我怎么能''返回'在后台线程上的数组? –

+0

如果你使用'NSOperationQueue',你可以使用'[NSOperationQueue mainQueue]''在主体上运行代码。我也用'dispatch_async'更新了我的答案,我用了一些基本示例。 – Jelly

+0

是的,我知道,但是当调用searchResults的getter(我使用'NSPredicate'过滤数组)时,我需要返回数组,但是如果它在后台线程上,我怎样才能返回正确的和更新的数组? –

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

我试过在我的'searchResults'数组的setter上使用'NSOperationQueue',但是我怎样才能在后台线程上返回数组呢? –

+0

* getter - 我的不好 –