Closed thonydam closed 8 years ago
@thonydam thanks for the example project, I think you found a bug in Realm, not specifically RBQFRC.
It appears Realm is not handling the compound predicate evaluation correctly. I will escalate this internally with the Realm team and create an issue in the realm-cocoa repo.
@bigfish24 ,
I am not sure if this is an issue related to Realm. I was able to fetch data from Realm using the same predicate, However got the crash with RBQFRC.
@thonydam the issue isn't related to RBQFRC, you are just seeing it there because it is using NSPredicate
evaluateWithObject:
method. As a sanity check, this code will crash and it isn't using RBQFRC at all:
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
TestObject *object = [TestObject testObjectWithTitle:@"Test" sortIndex:0 inTable:YES];
TestObject2 *object2 = [TestObject2 testObjectWithTitle:@"Title"];
[object.objects addObject:object2];
[realm commitWriteTransaction];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"inTable = YES AND objects.@count > 0"];
RLMResults *testObjects = [TestObject allObjects];
[predicate evaluateWithObject:testObjects.firstObject]; // Crashes here
From what I have been able to gather, the evaluateWithObject:
internally calls valueForKey:
on the object with the @count
as the key, but Realm is not catching this "special" key and performing the same collection query operation, but instead the key eventually just evaluates an "undefined" and crashes.
@bigfish24 Thanks for digging into this. Did you created an issue on the realm repo?
I am doing some test performance with RBQFRC and it seems like that fetching data is pretty slow.
Looking at the example project, it takes ~40ms to fetch data using the RBQFRC. With the same predicate, getting the objects directly from realm is taking ~1ms.
Have you experienced any performance issue?
@thonydam the performance difference is entirely expected because RBQFRC has to copy all of the objects from the fetch (this enables the grouping). Whereas with Realm the query is evaluated but the objects are lazy loaded only when accessed and the data isn't copied... That's part of what makes Realm so fast. So RBQFRC is a less than ideal abstraction to enable this extra functionality, but luckily Realm is working on building fine grained notifications directly into the framework which will make RBQFRC eventually irrelevant.
@bigfish24 Thanks for the details!
No worries, I look forward to sunsetting RBQFRC once Realm has support directly. This issue tracks the progress: https://github.com/realm/realm-cocoa/issues/601 of which the effort internally is getting close. The KVO support added recently laid the groundwork for it.
@thonydam just wanted to let you know that the original issue was fixed in Realm with this PR: https://github.com/realm/realm-cocoa/pull/2989
@bigfish24 Thank you for the update!
Hi everyone,
I'm implementing a RBQFetchedResultsController with a predicate that contains collection queries (@count) on a relationship.
I get crashes in RBQFetchRequest in "evaluateObject:" when it tries to evaluate the object with the predicate.
Here is the example project:
https://github.com/thonydam/RBQFetchedResultsControllerExample