Правилен метод за Realm.io с GCD?

Чудех се дали това е желаният метод за едновременност с GCD и realm.io. Получавам грешка „Realm accessed from incorrect thread error“, и двете пишат в едно и също Realm, но според документацията това е позволено?

RLMRealm *realm = [RLMRealm defaultRealm];
NSString *username = @"username3";
NSString *realmPath = realm.path;

dispatch_queue_t remote_registration_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(remote_registration_queue, ^(void) {
    [KUser remoteRegisterUsername:username realmPath:realmPath];
});

dispatch_queue_t local_registration_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(local_registration_queue, ^(void) {
    [KUser localRegistrationWithUsername:self.username password:password realmPath:realmPath];
});

В рамките на всеки метод аз извиквам:

RLMRealm *realm = [RLMRealm realmWithPath:realmPath];

person user1447447    schedule 26.01.2015    source източник
comment
възможен дубликат на Realm, достъпен от неправилна нишка   -  person ipmcc    schedule 26.01.2015
comment
Къде в документите се твърди, че трябва да можете да имате R/W достъп до един и същ файл едновременно от множество нишки? Това не ми изглежда като нещо, което би било разумно да се очаква, освен ако те изрично не твърдят, че го подкрепят.   -  person ipmcc    schedule 26.01.2015
comment
За достъп до един и същи Realm файл от различни нишки, трябва да извикате [RLMRealm defaultRealm], [RLMRealm realmWithPath:] или [RLMRealm realmWithPath:readOnly:error:], за да получите различен Realm обект за всяка нишка на вашето приложение. Докато посочите същия път, всички RLMRealm обекти ще се съпоставят към един и същи файл на диска. Споделянето на екземпляри на RLMRealm в нишки не се поддържа. Екземплярите на RLMRealm, които имат достъп до един и същ файл на областта, също трябва да използват една и съща стойност readOnly (или всички readwrite, или всички readonly).   -  person user1447447    schedule 26.01.2015
comment
Това не означава (за мен), че можете да ги използвате едновременно за R/W достъп.   -  person ipmcc    schedule 26.01.2015
comment
Според достъпа мисля, че е разумно заключение да се приеме R/W, ако не, те щяха да го уточнят. Оттам нататък това е логично следствие от първи ред.   -  person user1447447    schedule 26.01.2015
comment
@user1447447 бихте ли споделили повече от кода около използването на Realm? Това би направило диагностицирането на проблема много по-лесно.   -  person segiddins    schedule 26.01.2015
comment
Добавено още, всичко това е в контролера за един изглед. В рамките на всеки от методите на KUser извиквам [RLMRealm realmWithPath:] и извършвам операции за запис върху същия обект.   -  person user1447447    schedule 26.01.2015
comment
Да, след като прочетох по-задълбочено, изглежда, че Realm.io наистина поддържа едновременен достъп само с няколко ограничения. Моля, простете за коленичещия ми скептицизъм. :)   -  person ipmcc    schedule 27.01.2015
comment
Няма проблем! Всъщност реших да се откажа от Realm, любопитен съм как се чувствате за него, ако сте го използвали - изглеждаше добре отвън, но Yap беше по-добрият път за модела на едновременност, който исках.   -  person user1447447    schedule 27.01.2015


Отговори (1)


Опитахте ли го, без да преминете пътя на Кралството?

Вярвам, че правилният начин би бил да се използва RLMRealm *realm = [RLMRealm defaultRealm]; във всеки от методите, за да се получи препратка към правилното царство. Няма нужда да се притеснявате за пътя.

Така че трябва да можете да намалите кода, към който първо сте посочили:

NSString *username = @"username3";

dispatch_queue_t remote_registration_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(remote_registration_queue, ^(void) {
    [KUser remoteRegisterUsername:username];
});

dispatch_queue_t local_registration_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(local_registration_queue, ^(void) {
    [KUser localRegistrationWithUsername:self.username password:password];
});
person Kyle Fox    schedule 27.01.2015
comment
Да, това не проработи, но така или иначе исках възможността да посоча друг път и това не би трябвало да има значение. Ако областта по подразбиране наистина е единствената област, до която имате достъп едновременно, те трябва да посочат това в документите. Колкото и да си струва, преминах от Realm към Yap -› харесах концепцията на Realm, но много от дизайнерските решения не бях съгласен. Например, ако искаха модел на PONSO, наистина е неинтуитивно, че можете да редактирате само в рамките на транзакция, че RLMObjects не са безопасни за нишки и т.н. - person user1447447; 27.01.2015