2016-04-09 11 views
1

私は86111オブジェクトの配列を検索するのにUISearchControllerを使用しています(実際には私は各オブジェクトのnameプロパティで検索しています)。UISearchControllerはUIをフリーズします

何らかの理由で、検索バーに入力を開始すると、UIが数秒間フリーズしてからもう一度作業を開始します(たとえば、キーボードが1つの文字でフリーズするなど)。

私のUIは本当に大きいので、なぜそれが非常にゆっくりと検索されているのか分かりますが、なぜUIがフリーズしているのかわかりません(バックグラウンドスレッドで検索していませんか?

誰かが私を助けることができるようになります場合、私は本当に幸せになるでしょう

ありがとうございました!

答えて

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スレッド間の切り替えについての説明を参照してください。

+0

私は 'searchResults'配列のセッターで' NSOperationQueue'を使用しようとしましたが、バックグラウンドスレッドで配列を '返す 'ことができますか? –

+0

'NSOperationQueue'を使用しているなら、' [NSOperationQueue mainQueue] 'を使ってコードをメインで実行することができます。私はまた、いくつかの基本的なサンプルを 'dispatch_async'で更新しました – Jelly

+0

はい、私は知っていますが、' searchResults'のgetterが呼び出されているとき( 'NSPredicate'を使って配列をフィルタリングする)、配列を返す必要があります。バックグラウンドスレッドで、正しい配列と更新された配列を返すには? –

0

GCD(Grand Central Dispatch)を使用して、バックグラウンドスレッドで検索を実行できると思います。 UIの更新はメインスレッドで行う必要があるため、UIを更新するコード部分をdispatch_asyncブロックに移動することができます。

ディスパッチキューを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

'NSOperationQueue'を' searchResults'配列のセッターで使用しようとしましたが、バックグラウンドスレッドで配列を '返す 'ことができますか? –

+0

*ゲッター - 悪い –

関連する問題