Show
Ignore:
Timestamp:
05/11/2009 04:51:19 PM (3 years ago)
Author:
gbooker
Message:

Delete unused objects as they become unused so as to not need the prune call later. This will help accelerate things later. Also, handled XML a bit better.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/CoreData/SapphireFrappliance/MetaData/Support/SapphireMetaDataSupport.m

    r839 r840  
    4040#import "SapphireSeason.h" 
    4141#import "CoreDataSupportFunctions.h" 
     42 
     43@interface NSManagedObject (deleteDelegate) 
     44- (BOOL)shouldDelete; 
     45@end 
     46 
    4247 
    4348@interface NSManagedObject (ChangePersistence) 
     
    140145 
    141146static NSSet *coverArtExtentions = nil; 
     147static NSMutableSet *pendingDeleteObjects = nil; 
    142148 
    143149NSString *searchCoverArtExtForPath(NSString *path) 
     
    173179                                                  @"png", 
    174180                                                  @"gif", 
    175                                                   nil];  
     181                                                  nil]; 
     182        pendingDeleteObjects = [[NSMutableSet alloc] init]; 
    176183} 
    177184 
     
    258265} 
    259266 
     267+ (void)setObjectForPendingDelete:(NSManagedObject *)objectToDelete 
     268{ 
     269        [pendingDeleteObjects addObject:objectToDelete]; 
     270} 
     271 
     272/*! 
     273 * @brief Deletes pending objects 
     274 * 
     275 * Deletes all objects in the pending queue, but calls shouldDelete first to make sure it should 
     276 * be deleted.  This is also used as a hack to work around CD apparent inability to make KVO 
     277 * notifications during an object delete when it is within an KVO notification. 
     278 */ 
     279+ (void)deletePendingObjects 
     280{ 
     281        NSManagedObjectContext *mainMoc = [SapphireMetaDataSupport sharedInstance]->mainMoc; 
     282        [mainMoc processPendingChanges];                 
     283        while([pendingDeleteObjects count]) 
     284        { 
     285                NSManagedObject *obj; 
     286                NSSet *pendingObjects = [pendingDeleteObjects copy]; 
     287                [pendingDeleteObjects removeAllObjects]; 
     288                NSEnumerator *objEnum = [pendingObjects objectEnumerator]; 
     289                while((obj = [objEnum nextObject]) != nil) 
     290                { 
     291                        if([obj isDeleted]) 
     292                                continue; 
     293                        if([obj managedObjectContext] != mainMoc) 
     294                                continue; 
     295                        if(![obj respondsToSelector:@selector(shouldDelete)] || [obj shouldDelete]) 
     296                                [mainMoc deleteObject:obj]; 
     297                } 
     298                [pendingObjects release]; 
     299                [mainMoc processPendingChanges];                 
     300        } 
     301} 
     302 
    260303- (void)realWriteMetaData:(NSTimer *)timer 
    261304{ 
     
    274317        BOOL success = NO; 
    275318        @try { 
     319                [SapphireMetaDataSupport deletePendingObjects]; 
    276320                success = [context save:&error]; 
    277321        }