2016-04-09 26 views
1

86111 nesnenin bir dizisinde arama yapmak için UISearchController kullanıyorum (aslında her nesnenin name özelliğini arıyorum).UISearchController UI donmasını yapar

Herhangi bir nedenle, arama çubuğuna yazmaya başladığımda, kullanıcı arabirimi birkaç saniye donuyor ve sonra yeniden çalışmaya başlıyor (örneğin, klavye bir harfin üzerine donuyor, vb.).

Bunun nedeni, kullanıcı arayüzümün gerçekten çok büyük olması - neden çok yavaş aradığını anlayabiliyorum, ama neden UI'yi dondurduğunu anlayamıyorum (arka plan iş parçacığı üzerinde arama yapmıyor mu?).

Biri bana yardım etmek mümkün olacak eğer gerçekten mutlu olacağım

,

teşekkür ederiz!

cevap

1

Büyük olasılıkla gerçek aramanız (tüm nesneleriniz aracılığıyla) ana iş parçacığında gerçekleşir. UISearchController'un thread'larla ilgisi yok, programcının bu parçayı uygulamasına izin veriyor, bu yüzden arama için ana thread kullanıyorsunuz. Tüm bunları nasıl uygulayacağınızı bilmiyorum ama bir arka plan iş parçacığı üzerinde arama yapmak için dispatch_async veya NSOperationQueue kullanmalısınız.

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 
    }); 
}); 

parçacıkları arasında geçiş konusunda this yanıta bakın.

+0

'searchResults' dizisinin ayarlayıcısında' NSOperationQueue 'kullanmayı denedim, ancak arka plan dizisindeki diziyi nasıl döndürebilirim? –

+0

Eğer 'NSOperationQueue' kullanıyorsanız, '[NSOperationQueue mainQueue] 'kullanarak ana kod geri çalıştırabilirsiniz. Ayrıca 'dispatch_async' – Jelly

+0

ile bazı temel örneklerle cevabımı da güncelledim Evet biliyorum, ama searchResults' adlı alıcısı çağrıldığında (diziyi" NSPredicate "kullanarak filtreliyorum) diziyi döndürmem gerekiyor, ancak eğer Bir arka plan iş parçacığı üzerinde, doğru ve güncelleştirilmiş diziyi nasıl döndürebilirim? –

0

Aramanızı GCD (Grand Central Dispatch) kullanarak arka plan iş parçacığında gerçekleştirebilirsiniz. Daha sonra, UI güncellemesinin ana iş parçacığı içinde yapılması gerektiğinden, UI'yi dispatch_async bloğuna güncelleyen kod parçanızı taşıyabilirsiniz.

Sevkiyat sırasını hızlıca kullanırsanız, bu şekilde kod yazabilirsiniz.

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 kuyruğunu kullanırsanız, bu kodun çalışacağını düşünüyorum.

queue = NSOperationQueue() 

queue.addOperationWithBlock {() -> Void in 

    let resultArray = Search() 

    NSOperationQueue.mainQueue().addOperationWithBlock({ 
     UI_Update() 
    }) 
} 
+0

'searchResults' dizisinin ayarlayıcısında' NSOperationQueue 'kullanmayı denedim, ancak arka plan iş parçacığı üzerinde diziyi nasıl döndürebilirim? –

+0

* getter - kötüyüm –