У меня есть база данных realm в моем приложении, содержащая список из ~ 2000 пользователей.Realm Swift background search
В таблице отображаются эти пользователи, а панель поиска позволяет фильтровать их (по 6 различным свойствам каждого пользователя). Эта операция блокировала пользовательский интерфейс, поэтому я помещал его в фоновый поток.
Теперь это намного лучше, но я не уверен на 100%, что это лучший способ сделать это.
Можете ли вы предложить любые другие решения, если у вас есть что-то лучше?
Вот пример кода я использую:
func filterUsers(searchText:String,completion: (result: Array<User>) ->()){
var IIDS = Array<String>()
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {() -> Void in
let predicate1 = NSPredicate(format: "firstName contains[c] %@", searchText)
let predicate2 = NSPredicate(format: "lastName contains[c] %@", searchText)
let bgRealm = try! Realm()
bgRealm.beginWrite()
//Filter the whole list of users
var results = Array(bgRealm.objects(User)).filter {
//One user object by one
let usr:User = $0
//Reset the value by default
usr.searchResultField = ""
if predicate1.evaluateWithObject(usr) {
usr.searchResultField = "firstNameORlastName"
return true
}
else if predicate2.evaluateWithObject(usr) {
usr.searchResultField = "IID"
}
return false
};
try! bgRealm.commitWrite()
for usr in results {
IIDS.append("'\(usr.IID)'")
}
results.removeAll()
dispatch_async(dispatch_get_main_queue(), {() -> Void in
let realm = try! Realm()
let foundUsers = Array(realm.objects(User).filter("IID IN {\(IIDS.joinWithSeparator(","))}"))
IIDS.removeAll()
completion(result: foundUsers)
})
})
}