2016-06-27 4 views
0

Я хотел бы использовать область в моем проекте, но у меня очень сложный фильтр и сортировка. Я должен заказать список по имени, но имя находится в другом классе.Realm 1.0 Как я могу использовать thread

class CustomObject: Object 
{ 
    dynamic var objectId = 0 
    let objectLangs = List<ObjectLang>() 
} 

class ObjectLang: Object 
{ 
    dynamic var objectId = 0 
    dynamic var name = "" 
} 

Когда у меня есть более 130 строк, он очень медленный в основной теме и блокирует пользовательский интерфейс. Я попытался сделать это в фоновом потоке, но когда я хочу обновить интерфейс, он был разбит Realm. Итак, какое идеальное решение? Как я могу использовать его? Не могли бы вы привести мне пример или учебник? Я прочитал путеводную линию.

ответ

0

Если программа была повреждена при обновлении пользовательского интерфейса в фоновом потоке, вы должны обновить интерфейс в главном потоке, когда задача в области управления будет завершена.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), { 
    let realm = try! Realm() 

    //do What you need 

    dispatch_async(dispatch_get_main_queue(), { 
     //updateUI() 
    }) 
}) 
+0

Я обновил основную тему, но я не могу просмотреть список объектов. Я получил ошибку в области. –

+0

Не можете ли вы получить список объектов по области? Или в памяти? Постскриптум Я начинаю переполнение стека, поэтому я не могу добавить комментарий к вашему ответу. – Hulk

+0

Вы добавляете свой объект в блок записи? 'Попробовать! realm.write { realm.add (YourObejct) } ' – Hulk

0

Вы не можете использовать аксесуары Realm через потоки. Вам нужно будет восстановить объекты в потоке, в котором вы хотите их использовать. Чтобы это произошло, я бы рекомендовал для каждого из ваших классов объектов, которые должны быть переданы между потоками, чтобы назначить свойство в качестве первичного ключа. Это свойство может быть objectId в вашем случае.

class CustomObject: Object { 
    dynamic var objectId = 0 
    let objectLangs = List<ObjectLang>() 

    override class func primaryKey() -> String { 
     return "objectId" 
    } 
} 

Этот первичный ключ может быть использован для идентификации ваших объектов и передать их в основной поток, чтобы получить их там снова.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0) { 
    let realm = try! Realm() 

    var objects = realm.objects(CustomObject) 
    // objects = objects.filter(…) 
    let sortedObjects: [CustomObject] = objects.sort { /* … */ } 
    let ids = sortedObjects.map { $0.objectId } 

    dispatch_async(dispatch_get_main_queue()) { 
     let realm = try! Realm() 
     let objects = ids.map { 
      realm.objectForPrimaryKey(CustomObject.self, key: $0) 
     } 
     updateUIWithObjects(objects) 
    } 
} 
Смежные вопросы