【问题标题】:UISearchController makes UI freezeUISearchController 使 UI 冻结
【发布时间】:2016-04-09 06:01:42
【问题描述】:

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

由于某种原因,当我开始在搜索栏上键入内容时,UI 冻结了几秒钟,然后又开始工作(例如,键盘在一个字母上冻结等)。

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

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

谢谢!

【问题讨论】:

    标签: ios objective-c iphone cocoa-touch uisearchcontroller


    【解决方案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关于线程切换的回答。

    【讨论】:

    • 我尝试在searchResults 数组的设置器上使用NSOperationQueue,但我如何才能在后台线程上使用return 数组?
    • 如果您使用NSOperationQueue,您可以使用[NSOperationQueue mainQueue] 在主服务器上运行代码。我还用dispatch_async 的一些基本示例更新了我的答案
    • 是的,我知道,但是当 searchResults 的 getter 被调用时(我使用 NSPredicate 过滤数组)我需要返回数组,但如果它在后台线程上,如何我可以返回正确和更新的数组吗?
    • 你不能return。当搜索完成时,您必须使用block 来执行您需要的操作(更新 UI)。如果您将其返回,则主线程将不得不等待后台线程完成,这将使其阻塞,从而破坏拥有后台线程的整个目的。
    【解决方案2】:

    我认为您可以使用 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()
        })
    }
    

    【讨论】:

    • 我尝试在searchResults 数组的设置器上使用NSOperationQueue,但我如何才能在后台线程上使用return 数组?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2015-01-16
    • 2019-09-16
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    相关资源
    最近更新 更多