root/branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireMovie.m @ 836

Revision 836, 18.5 KB (checked in by gbooker, 17 months ago)

Better place to handle files added and removed from episodes and movies

Line 
1#import "SapphireMovie.h"
2#import "SapphireGenre.h"
3#import "SapphireCast.h"
4#import "SapphireDirector.h"
5#import "CoreDataSupportFunctions.h"
6#import "SapphireMetaDataSupport.h"
7#import "SapphireFileMetaData.h"
8#import "SapphireApplianceController.h"
9#import "SapphireXMLData.h"
10#import "NSString-Extensions.h"
11#import "SapphireMovieTranslation.h"
12
13NSString *FILE_DID_CHANGE_MOVIE_NOTIFICATION = @"FileDidChangeMovie";
14NSString *MOVIE_DID_CHANGE_PREDICATE_MATCHING = @"MovieDidChangePredicateMatching";
15
16#define ORDERED_CAST_KEY                        @"orderedCast"
17#define ORDERED_CAST_DATA                       @"orderedCastData"
18#define OVERRIDDEN_CAST_DATA            @"overriddenCastData"
19#define ORDERED_DIRECTOR_KEY            @"orderedDirectors"
20#define ORDERED_DIRECTOR_DATA           @"orderedDirectorsData"
21#define OVERRIDDEN_DIRECTOR_DATA        @"overriddenDirectorsData"
22#define ORDERED_GENRES_KEY                      @"orderedGenres"
23#define ORDERED_GENRES_DATA                     @"orderedGenresData"
24#define OVERRIDDEN_GENRES_DATA          @"overriddenGenresData"
25
26
27@implementation SapphireMovie
28
29+ (SapphireMovie *)movieWithIMDB:(int)imdbNumber inContext:(NSManagedObjectContext *)moc
30{
31        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"imdbNumber == %d", imdbNumber];
32        return (SapphireMovie *)doSingleFetchRequest(SapphireMovieName, moc, predicate);
33}
34       
35+ (SapphireMovie *)createMovieWithIMDB:(int)imdbNumber inContext:(NSManagedObjectContext *)moc
36{
37        SapphireMovie *ret = [SapphireMovie movieWithIMDB:imdbNumber inContext:moc];
38        if(ret != nil)
39                return ret;
40       
41        ret = [NSEntityDescription insertNewObjectForEntityForName:SapphireMovieName inManagedObjectContext:moc];
42        ret.imdbNumber = [NSNumber numberWithInt:imdbNumber];
43        return ret;
44}
45
46+ (SapphireMovie *)movieWithTitle:(NSString *)title inContext:(NSManagedObjectContext *)moc
47{
48        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"imdbNumber == nil && title == %@", title];
49        return (SapphireMovie *)doSingleFetchRequest(SapphireMovieName, moc, predicate);
50}
51
52+ (SapphireMovie *)createMovieWithTitle:(NSString *)title inContext:(NSManagedObjectContext *)moc
53{
54        SapphireMovie *ret = [SapphireMovie movieWithTitle:title inContext:moc];
55        if(ret != nil)
56                return ret;
57       
58        ret = [NSEntityDescription insertNewObjectForEntityForName:SapphireMovieName inManagedObjectContext:moc];
59        ret.title = title;
60        ret.imdbNumber = nil;
61        return ret;
62}
63
64+ (SapphireMovie *)movieWithDictionary:(NSDictionary *)dict inContext:(NSManagedObjectContext *)moc
65{
66        return [self movieWithDictionary:dict inContext:moc lookup:nil];
67}
68
69+ (SapphireMovie *)movieWithDictionary:(NSDictionary *)dict inContext:(NSManagedObjectContext *)moc lookup:(NSDictionary *)lookup
70{
71        NSString *imdbStr = [dict objectForKey:META_MOVIE_IDENTIFIER_KEY];
72        int imdbNumber = [SapphireMovie imdbNumberFromString:imdbStr];
73        if(imdbNumber == 0)
74                return nil;
75       
76        SapphireMovie *ret = [SapphireMovie createMovieWithIMDB:imdbNumber inContext:moc];
77        ret.title = [dict objectForKey:META_MOVIE_TITLE_KEY];
78        ret.releaseDate = [dict objectForKey:META_MOVIE_RELEASE_DATE_KEY];
79        ret.MPAARating = [dict objectForKey:META_MOVIE_MPAA_RATING_KEY];
80        ret.imdbRating = [dict objectForKey:META_MOVIE_IMDB_RATING_KEY];
81        ret.plot = [dict objectForKey:META_MOVIE_PLOT_KEY];
82        id value = [dict objectForKey:META_MOVIE_IMDB_250_KEY];
83        int i;
84        if((i = [value intValue]) != 0)
85                ret.imdbTop250RankingValue = i;
86        value = [dict objectForKey:META_MOVIE_OSCAR_KEY];
87        if((i = [value intValue]) != 0)
88                ret.oscarsWonValue = i;
89        NSMutableArray *genreArray = [NSMutableArray array];
90        NSEnumerator *genreEnum = [[dict objectForKey:META_MOVIE_GENRES_KEY] objectEnumerator];
91        NSString *genre;
92        while((genre = [genreEnum nextObject]) != nil)
93                [genreArray addObject:[SapphireGenre createGenre:genre inContext:moc]];
94        ret.orderedGenres = genreArray;
95       
96        NSMutableDictionary *directorLookup = [lookup objectForKey:@"Directors"];
97        NSMutableArray *dirArray = [NSMutableArray array];
98        NSEnumerator *directorEnum = [[dict objectForKey:META_MOVIE_DIRECTOR_KEY] objectEnumerator];
99        if(directorLookup == nil)
100        {
101                NSString *director;
102                while((director = [directorEnum nextObject]) != nil)
103                        [dirArray addObject:[SapphireDirector createDirector:director inContext:moc]];
104        }
105        else
106        {
107                NSString *director;
108                while((director = [directorEnum nextObject]) != nil)
109                {
110                        SapphireDirector *cached = [directorLookup objectForKey:director];
111                        if(cached == nil)
112                        {
113                                cached = [SapphireDirector createDirector:director inContext:moc];
114                                [directorLookup setObject:cached forKey:director];
115                        }
116                        [dirArray addObject:cached];
117                }
118        }
119        ret.orderedDirectors = dirArray;
120
121        NSMutableDictionary *castLookup = [lookup objectForKey:@"Cast"];
122        NSMutableArray *castArray = [NSMutableArray array];
123        NSEnumerator *castEnum = [[dict objectForKey:META_MOVIE_CAST_KEY] objectEnumerator];
124        NSString *cast;
125        if(castLookup == nil)
126        {
127                while((cast = [castEnum nextObject]) != nil)
128                        [castArray addObject:[SapphireCast createCast:cast inContext:moc]];
129        }
130        else
131        {
132                while((cast = [castEnum nextObject]) != nil)
133                {
134                        SapphireCast *cached = [castLookup objectForKey:cast];
135                        if(cached == nil)
136                        {
137                                cached = [SapphireCast createCast:cast inContext:moc];
138                                [castLookup setObject:cached forKey:cast];
139                        }
140                        [castArray addObject:cached];
141                }
142        }
143        ret.orderedCast = castArray;
144        return ret;
145}
146
147+ (int)imdbNumberFromString:(NSString *)imdbStr
148{
149        int imdbNumber = 0;
150        if(imdbStr != nil)
151        {
152                NSScanner *scanner = [NSScanner scannerWithString:imdbStr];
153                [scanner scanUpToCharactersFromSet:[NSCharacterSet decimalDigitCharacterSet] intoString:nil];
154                [scanner scanInt:&imdbNumber];
155        }
156        return imdbNumber;
157}
158
159+ (NSDictionary *)upgradeV1MoviesFromContext:(NSManagedObjectContext *)oldMoc toContext:(NSManagedObjectContext *)newMoc withCast:(NSDictionary *)cast directors:(NSDictionary *)directors genres:(NSDictionary *)genres
160{
161        NSMutableDictionary *lookup = [NSMutableDictionary dictionary];
162        NSArray *oldMovies = doFetchRequest(SapphireMovieName, oldMoc, nil);
163        NSEnumerator *movieEnum = [oldMovies objectEnumerator];
164        NSManagedObject *oldMovie;
165        while((oldMovie = [movieEnum nextObject]) != nil)
166        {
167                SapphireMovie *newMovie = [NSEntityDescription insertNewObjectForEntityForName:SapphireMovieName inManagedObjectContext:newMoc];
168                NSNumber *imdbNumber = [oldMovie valueForKey:@"imdbNumber"];
169                newMovie.imdbNumber = imdbNumber;
170                newMovie.imdbRating = [oldMovie valueForKey:@"imdbRating"];
171                newMovie.imdbTop250Ranking = [oldMovie valueForKey:@"imdbTop250Ranking"];
172                newMovie.MPAARating = [oldMovie valueForKey:@"MPAARating"];
173                newMovie.oscarsWon = [oldMovie valueForKey:@"oscarsWon"];
174                newMovie.plot = [oldMovie valueForKey:@"plot"];
175                newMovie.releaseDate = [oldMovie valueForKey:@"releaseDate"];
176                newMovie.title = [oldMovie valueForKey:@"title"];
177               
178                NSData *propData = [oldMovie valueForKey:@"orderedCastData"];
179                NSArray *castNames = [NSKeyedUnarchiver unarchiveObjectWithData:propData];
180                NSEnumerator *castEnum = [castNames objectEnumerator];
181                NSString *name;
182                NSMutableArray *objArray = [NSMutableArray array];
183                while((name = [castEnum nextObject]) != nil)
184                {
185                        [objArray addObject:[cast objectForKey:name]];
186                }
187                newMovie.orderedCast = objArray;
188               
189                propData = [oldMovie valueForKey:@"orderedDirectorsData"];
190                NSArray *directorNames = [NSKeyedUnarchiver unarchiveObjectWithData:propData];
191                NSEnumerator *directorEnum = [directorNames objectEnumerator];
192                objArray = [NSMutableArray array];
193                while((name = [directorEnum nextObject]) != nil)
194                {
195                        [objArray addObject:[directors objectForKey:name]];
196                }
197                newMovie.orderedDirectors = objArray;
198               
199                propData = [oldMovie valueForKey:@"orderedGenresData"];
200                NSArray *genreNames = [NSKeyedUnarchiver unarchiveObjectWithData:propData];
201                NSEnumerator *genreEnum = [genreNames objectEnumerator];
202                objArray = [NSMutableArray array];
203                while((name = [genreEnum nextObject]) != nil)
204                {
205                        [objArray addObject:[genres objectForKey:name]];
206                }
207                newMovie.orderedGenres = objArray;
208               
209                NSEnumerator *translationEnum = [[oldMovie valueForKey:@"translations"] objectEnumerator];
210                NSManagedObject *translation;
211                while((translation = [translationEnum nextObject]) != nil)
212                {
213                        [SapphireMovieTranslation upgradeV1MovieTranslation:translation toMovie:newMovie];
214                }
215                [lookup setObject:newMovie forKey:imdbNumber];
216        }
217        return lookup;
218}
219
220- (NSComparisonResult)releaseDateCompare:(SapphireMovie *)other
221{
222        return [self.releaseDate compare:other.releaseDate];
223}
224
225- (NSComparisonResult)titleCompare:(SapphireMovie *)other
226{
227        return [self.title nameCompare:other.title];
228}
229
230- (NSComparisonResult)imdbTop250RankingCompare:(SapphireMovie *)other
231{
232        return [self.imdbTop250Ranking compare:other.imdbTop250Ranking];
233}
234
235- (NSComparisonResult)oscarsWonCompare:(SapphireMovie *)other
236{
237        return [self.oscarsWon compare:other.oscarsWon];
238}
239
240- (NSComparisonResult)imdbRatingCompare:(SapphireMovie *)other
241{
242        NSNumber *otherNum = other.imdbRating;
243        NSNumber *myNum = self.imdbRating;
244        if(myNum != nil)
245                if(otherNum != nil)
246                        return [myNum compare:otherNum];
247                else
248                        return NSOrderedDescending;
249        else if(otherNum != nil)
250                return NSOrderedAscending;
251        return NSOrderedSame;
252}
253
254- (NSArray *)orderedCast
255{
256        [self willAccessValueForKey:ORDERED_CAST_KEY];
257        NSArray *ret = [self primitiveValueForKey:ORDERED_CAST_KEY];
258        [self didAccessValueForKey:ORDERED_CAST_KEY];
259        if(ret == nil)
260        {
261                NSData *propData = [self valueForKey:OVERRIDDEN_CAST_DATA];
262                if(propData == nil)
263                        propData = [self valueForKey:ORDERED_CAST_DATA];
264                if(propData != nil)
265                {
266                        NSArray *names = [NSKeyedUnarchiver unarchiveObjectWithData:propData];
267                        NSMutableArray *mutRet = [NSMutableArray arrayWithCapacity:[names count]];
268                        NSManagedObjectContext *moc = [self managedObjectContext];
269                        NSEnumerator *nameEnum = [names objectEnumerator];
270                        NSString *name;
271                        while((name = [nameEnum nextObject]) != nil)
272                        {
273                                SapphireCast *aCast = [SapphireCast cast:name inContext:moc];
274                                if(aCast != nil)
275                                        [mutRet addObject:aCast];
276                        }
277                        ret = [NSArray arrayWithArray:mutRet];
278                        [self setPrimitiveValue:ret forKey:ORDERED_CAST_KEY];
279                }
280        }
281       
282        return ret;
283}
284
285- (void)setOrderedCast:(NSArray *)ordered
286{
287        [self willChangeValueForKey:ORDERED_CAST_KEY];
288        [self setPrimitiveValue:ordered forKey:ORDERED_CAST_KEY];
289        [self didChangeValueForKey:ORDERED_CAST_KEY];
290        NSArray *arc = [ordered valueForKey:@"name"];
291        [self setValue:[NSKeyedArchiver archivedDataWithRootObject:arc] forKey:ORDERED_CAST_DATA];
292        [self.castSet setSet:[NSSet setWithArray:ordered]];
293        int i, count=[ordered count];
294        if(count > 10)
295                count = 10;
296        for(i=0; i<count; i++)
297        {
298                ((SapphireCast *)[ordered objectAtIndex:i]).hasMajorRoleValue = YES;
299        }       
300}
301
302- (NSArray *)orderedGenres
303{
304        [self willAccessValueForKey:ORDERED_GENRES_KEY];
305        NSArray *ret = [self primitiveValueForKey:ORDERED_GENRES_KEY];
306        [self didAccessValueForKey:ORDERED_GENRES_KEY];
307        if(ret == nil)
308        {
309                NSData *propData = [self valueForKey:OVERRIDDEN_GENRES_DATA];
310                if(propData == nil)
311                        propData = [self valueForKey:ORDERED_GENRES_DATA];
312                if(propData != nil)
313                {
314                        NSArray *genres = [NSKeyedUnarchiver unarchiveObjectWithData:propData];
315                        NSMutableArray *mutRet = [NSMutableArray arrayWithCapacity:[genres count]];
316                        NSManagedObjectContext *moc = [self managedObjectContext];
317                        NSEnumerator *genreEnum = [genres objectEnumerator];
318                        NSString *genre;
319                        while((genre = [genreEnum nextObject]) != nil)
320                        {
321                                SapphireGenre *aGenre = [SapphireGenre genre:genre inContext:moc];
322                                if(aGenre != nil)
323                                        [mutRet addObject:aGenre];
324                        }
325                        ret = [NSArray arrayWithArray:mutRet];
326                        [self setPrimitiveValue:ret forKey:ORDERED_GENRES_KEY];
327                }
328        }
329       
330        return ret;
331}
332
333- (void)setOrderedGenres:(NSArray *)ordered
334{
335        [self willChangeValueForKey:ORDERED_GENRES_KEY];
336        [self setPrimitiveValue:ordered forKey:ORDERED_GENRES_KEY];
337        [self didChangeValueForKey:ORDERED_GENRES_KEY];
338        NSArray *arc = [ordered valueForKey:@"name"];
339        [self setValue:[NSKeyedArchiver archivedDataWithRootObject:arc] forKey:ORDERED_GENRES_DATA];
340        [self.genresSet addObjectsFromArray:ordered];
341}
342
343- (NSArray *)orderedDirectors
344{
345        [self willAccessValueForKey:ORDERED_DIRECTOR_KEY];
346        NSArray *ret = [self primitiveValueForKey:ORDERED_DIRECTOR_KEY];
347        [self didAccessValueForKey:ORDERED_DIRECTOR_KEY];
348        if(ret == nil)
349        {
350                NSData *propData = [self valueForKey:OVERRIDDEN_DIRECTOR_DATA];
351                if(propData == nil)
352                        propData = [self valueForKey:ORDERED_DIRECTOR_DATA];
353                if(propData != nil)
354                {
355                        NSArray *names = [NSKeyedUnarchiver unarchiveObjectWithData:propData];
356                        NSMutableArray *mutRet = [NSMutableArray arrayWithCapacity:[names count]];
357                        NSManagedObjectContext *moc = [self managedObjectContext];
358                        NSEnumerator *nameEnum = [names objectEnumerator];
359                        NSString *name;
360                        while((name = [nameEnum nextObject]) != nil)
361                        {
362                                SapphireDirector *aDir = [SapphireDirector director:name inContext:moc];
363                                if(aDir != nil)
364                                        [mutRet addObject:aDir];
365                        }
366                        ret = [NSArray arrayWithArray:mutRet];
367                        [self setPrimitiveValue:ret forKey:ORDERED_DIRECTOR_KEY];
368                }
369        }
370       
371        return ret;
372}
373
374- (void)setOrderedDirectors:(NSArray *)ordered
375{
376        [self willChangeValueForKey:ORDERED_DIRECTOR_KEY];
377        [self setPrimitiveValue:ordered forKey:ORDERED_DIRECTOR_KEY];
378        [self didChangeValueForKey:ORDERED_DIRECTOR_KEY];
379        NSArray *arc = [ordered valueForKey:@"name"];
380        [self setValue:[NSKeyedArchiver archivedDataWithRootObject:arc] forKey:ORDERED_DIRECTOR_DATA];
381        [self.directorsSet addObjectsFromArray:ordered];
382}
383
384#define checkOrderedData(property, overridden) \
385{ \
386        NSEnumerator *xmlEnum = [self.xmlSet objectEnumerator]; \
387        SapphireXMLData *xml; \
388        while([overridden count] == 0 && (xml = [xmlEnum nextObject]) != nil) \
389                overridden = xml.property; \
390}
391
392- (void)checkOrderedCast
393{
394        NSArray *overridden = nil;
395        checkOrderedData(orderedCast, overridden);
396        if(![overridden count])
397                self.overriddenCastData = nil;
398        else
399        {
400                NSArray *names = [overridden valueForKey:@"name"];
401                self.overriddenCastData = [NSKeyedArchiver archivedDataWithRootObject:names];
402        }
403        [self setPrimitiveValue:nil forKey:ORDERED_CAST_KEY];
404        [self.castSet setSet:[NSSet setWithArray:self.orderedCast]];
405}
406
407- (void)checkOrderedGenres
408{
409        NSArray *overridden = nil;
410        checkOrderedData(orderedGenres, overridden);
411        if(![overridden count])
412                self.overriddenGenresData = nil;
413        else
414        {
415                NSArray *names = [overridden valueForKey:@"name"];
416                self.overriddenGenresData = [NSKeyedArchiver archivedDataWithRootObject:names];
417        }
418        [self setPrimitiveValue:nil forKey:ORDERED_GENRES_KEY];
419        [self.genresSet setSet:[NSSet setWithArray:self.orderedGenres]];
420}
421
422- (void)checkOrderedDirectors
423{
424        NSArray *overridden = nil;
425        checkOrderedData(orderedDirectors, overridden);
426        if(![overridden count])
427                self.overriddenDirectorsData = nil;
428        else
429        {
430                NSArray *names = [overridden valueForKey:@"name"];
431                self.overriddenDirectorsData = [NSKeyedArchiver archivedDataWithRootObject:names];
432        }
433        [self setPrimitiveValue:nil forKey:ORDERED_DIRECTOR_KEY];
434        [self.directorsSet setSet:[NSSet setWithArray:self.orderedDirectors]];
435}
436
437- (void)checkXMLOverridenSets
438{
439        [self checkOrderedCast];
440        [self checkOrderedGenres];
441        [self checkOrderedDirectors];
442}
443
444- (void)addXml:(NSSet*)addedXMLs
445{
446        [super addXml:addedXMLs];
447        [self checkXMLOverridenSets];
448}
449
450-(void)removeXml:(NSSet*)removedXMLs
451{
452        [super removeXml:removedXMLs];
453        [self checkXMLOverridenSets];
454}
455
456- (void)addXmlObject:(SapphireXMLData*)addedXML
457{
458        [super addXmlObject:addedXML];
459        [self checkXMLOverridenSets];
460}
461
462- (void)removeXmlObject:(SapphireXMLData*)removedXML
463{
464        [super removeXmlObject:removedXML];
465        [self checkXMLOverridenSets];
466}
467
468- (NSString *)title
469{
470        overrideWithXMLForKey(NSString, title);
471        return super.title;
472}
473
474- (NSString *)plot
475{
476        overrideWithXMLForKey(NSString, summary);
477        overrideWithXMLForKey(NSString, contentDescription);
478        return super.plot;
479}
480
481- (BOOL)castMemberHasMajorRoleStatus:(SapphireCast *)cast
482{
483        NSArray *ordered = self.orderedCast;
484        int i, count=[ordered count];
485        if(count > 10)
486                count = 10;
487        for(i=0; i<count; i++)
488        {
489                if([ordered objectAtIndex:i] == cast)
490                        return YES;
491        }
492        return NO;
493}
494
495- (NSString *)path
496{
497        return [@"@MOVIES/Movie" stringByAppendingPathComponent:[self.imdbNumber stringValue]];
498}
499
500- (NSString *)coverArtPath
501{
502        return [NSString stringWithFormat:@"%@/@MOVIES/%@", [SapphireMetaDataSupport collectionArtPath], self.imdbNumber];
503}
504
505- (void)insertDisplayMetaData:(NSMutableDictionary *)dict
506{
507        id value = [self title];
508        if(value != nil)
509                [dict setObject:value forKey:META_MOVIE_TITLE_KEY];
510        value = [self MPAARating];
511        if(value != nil)
512                [dict setObject:value forKey:META_MOVIE_MPAA_RATING_KEY];
513        value = [self imdbRating];
514        if(value != nil)
515                [dict setObject:value forKey:META_MOVIE_IMDB_RATING_KEY];
516        value = [self plot];
517        if(value != nil)
518                [dict setObject:value forKey:META_MOVIE_PLOT_KEY];
519        value = [self releaseDate];
520        if(value != nil)
521                [dict setObject:value forKey:META_MOVIE_RELEASE_DATE_KEY];
522        value = [self imdbTop250Ranking];
523        if(value != nil)
524                [dict setObject:value forKey:META_MOVIE_IMDB_250_KEY];
525        value = [self oscarsWon];
526        if(value != nil)
527                [dict setObject:value forKey:META_MOVIE_OSCAR_KEY];
528        value = [[self orderedDirectors] valueForKey:@"name"];
529        if(value != nil)
530                [dict setObject:value forKey:META_MOVIE_DIRECTOR_KEY];
531        value = [[self orderedCast] valueForKey:@"name"];
532        if(value != nil)
533                [dict setObject:value forKey:META_MOVIE_CAST_KEY];
534        value = [[self orderedGenres] valueForKey:@"name"];
535        if(value != nil)
536                [dict setObject:value forKey:META_MOVIE_GENRES_KEY];
537}
538
539- (NSNumber *)watched
540{
541        NSSet *files = self.filesSet;
542        if([files count] < 2)
543                return [[files anyObject] watched];
544       
545        NSArray *remain = [[files allObjects] filteredArrayUsingPredicate:[SapphireApplianceController unwatchedPredicate]];
546        if([remain count])
547                return [NSNumber numberWithBool:YES];
548        return [NSNumber numberWithBool:NO];
549}
550
551- (NSNumber *)favorite
552{
553        NSSet *files = self.filesSet;
554        if([files count] < 2)
555                return [[files anyObject] favorite];
556       
557        NSArray *remain = [[files allObjects] filteredArrayUsingPredicate:[SapphireApplianceController favoritePredicate]];
558        if([remain count])
559                return [NSNumber numberWithBool:YES];
560        return [NSNumber numberWithBool:NO];
561}
562
563- (void)clearPredicateCache
564{
565        [self.orderedGenres makeObjectsPerformSelector:@selector(clearPredicateCache)];
566        [self.orderedDirectors makeObjectsPerformSelector:@selector(clearPredicateCache)];
567        [self.orderedCast makeObjectsPerformSelector:@selector(clearPredicateCache)];
568        [[NSNotificationCenter defaultCenter] postNotificationName:MOVIE_DID_CHANGE_PREDICATE_MATCHING object:self];
569}
570
571- (void)addFiles:(NSSet*)addedFiles
572{
573        [super addFiles:addedFiles];
574        [self clearPredicateCache];
575}
576
577-(void)removeFiles:(NSSet*)removeFiles
578{
579        [super removeFiles:removeFiles];
580        [self clearPredicateCache];
581}
582
583- (void)addFilesObject:(SapphireFileMetaData *)addedFile
584{
585        [super addFilesObject:addedFile];
586        [self clearPredicateCache];
587}
588
589- (void)removeFilesObject:(SapphireFileMetaData *)removeFile
590{
591        [super removeFilesObject:removeFile];
592        [self clearPredicateCache];
593}
594
595@end
Note: See TracBrowser for help on using the browser.