开发者

NSFetchResultsController w/ NSPredicate (relationship) vs. Basic NSFetchRequest (Pic Included)

开发者 https://www.devze.com 2023-02-16 21:49 出处:网络
Here is an image of the relationship I am debating: I have a UIScrollView setup as a horizontal scroller that scrolls between 3 different UIViewControllers (containing a UITableView of course and th

Here is an image of the relationship I am debating:

NSFetchResultsController w/ NSPredicate (relationship) vs. Basic NSFetchRequest (Pic Included)

I have a UIScrollView setup as a horizontal scroller that scrolls between 3 different UIViewControllers (containing a UITableView of course and the required delegate methods, etc.)

Each ViewController in the UIScrollView loads a UITableView of a specific MyObjectType.

(E.g. ViewController1 loads a tableview of all MyObjects where its type == MyObjectType.name)

Does this make sense? You'll notice I've setup an inverse relationship between the objects. A MyObjectType ca开发者_StackOverflow社区n have many MyObject's but a MyObject can only have a single MyObjectType associated to it.

When I first load one of the UIScrollView viewController's I need to determine what MyObjectType this UITableView is for. I have this working fine and I set the Table Header accordingly.

E.g. [type valueForKey:@"name"] where type is a fetched result NSManagedObject of MyObjectType.

The thing is I'm wondering, when I obtain this NSManagedObject of MyObjectType do I not also have access to a NSSet *array (ie. [type valueForKey:@"objects"]) which I can use as the UITableView's datasource? Would this work if after I add or delete an object I save the managedContext and then I always [tableView reloadData] ?

I'm guessing this would work, as long as I don't require the UITableView content to change and update dynamically as new MyObject of this type are added? For this we require a NSFetchedResultsController right?

Here is my code for loading ALL MyObject's into a UITableView (which works):

- (NSFetchedResultsController *)fetchedResultsController {

if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
}

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"MyObject" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
                          initWithKey:@"creationDate" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                    managedObjectContext:managedObjectContext sectionNameKeyPath:@"transientSectionDate" 
                                               cacheName:@"Root"];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;

[sort release];
[fetchRequest release];
[theFetchedResultsController release];

return _fetchedResultsController;    

}

Could someone PLEASE be as so kind to show my what actual NSPredicate declaration I need to correctly load ONLY MyObject's whose MyObjectType.name == @"XXXXXX"? Let's assume I already have a MyObjectType.name stored in a retained NSString inside the ViewController.

Thanks in advance!


The predicate format string would be:

@"ALL type.name=%@", typeName

However, since you do have a particular MyObjectType object, you already have direct access to the needed MyObject objects and don't have to waste time trying to fetch them. Just convert the set into a sorted array.

To keep apprised of ongoing changes while the table is active, implement observeValueForKeyPath:ofObject:change:context: in the tableview datasource object. Then send addObserver:forKeyPath:options:context: to that particular MyObjectType object like so:

[anObjectType addObserver:self 
               forKeyPath:@"objects" 
                  options:(NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld) 
                  context:nil];

Now, whenever the objects value of that paticular MyObjectType changes, the tableview's datasource will be notified and can change the table.

See Key-Value Observing Programming Guide for details.

0

精彩评论

暂无评论...
验证码 换一张
取 消