Changeset 820

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

Use a separate thread for rescanning a directory and send changes back to main thread. Tricky, but it works.

Location:
branches/CoreData/SapphireFrappliance
Files:
7 modified

Legend:

Unmodified
Added
Removed
  • branches/CoreData/SapphireFrappliance/FRAppliance/SapphireApplianceController.h

    r800 r820  
    146146 * 
    147147 * @param storeFile The file path of the store (must be SQLite), nil for default path 
    148  * @param storeOptions The dictionary of options for the store 
    149148 * @return The managed object context, nil if failure 
    150149 */ 
    151 + (NSManagedObjectContext *)newManagedObjectContextForFile:(NSString *)storeFile options:(NSDictionary *)storeOptions; 
     150+ (NSManagedObjectContext *)newManagedObjectContextForFile:(NSString *)storeFile; 
    152151 
    153152/*! 
  • branches/CoreData/SapphireFrappliance/FRAppliance/SapphireApplianceController.m

    r802 r820  
    278278 
    279279 
    280 + (NSManagedObjectContext *)newManagedObjectContextForFile:(NSString *)storeFile options:(NSDictionary *)storeOptions 
     280+ (NSManagedObjectContext *)newManagedObjectContextForFile:(NSString *)storeFile 
    281281{ 
    282282        if(storeFile == nil) 
     
    293293         
    294294        NSPersistentStoreCoordinator *coord = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; 
    295         if(![coord addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:storeOptions error:&error]) 
     295        if(![coord addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) 
    296296        { 
    297297                SapphireLog(SAPPHIRE_LOG_ALL, SAPPHIRE_LOG_LEVEL_ERROR, @"Could not add store: %@", error); 
     
    321321        [theme setScene:[self scene]]; 
    322322         
    323         moc = [SapphireApplianceController newManagedObjectContextForFile:nil options:nil]; 
     323        moc = [SapphireApplianceController newManagedObjectContextForFile:nil]; 
     324        [SapphireMetaDataSupport setMainContext:moc]; 
    324325        if(moc == nil) 
    325326        { 
     
    530531} 
    531532 
     533- (void)completeRescanOfDir:(NSArray *)filePaths 
     534{ 
     535        if(![filePaths count]) 
     536                return; 
     537         
     538        [SapphireMetaDataSupport save:moc]; 
     539        NSString *dirPath = [[filePaths objectAtIndex:0] stringByDeletingLastPathComponent]; 
     540        SapphireDirectoryMetaData *dir = [SapphireDirectoryMetaData directoryWithPath:dirPath inContext:moc]; 
     541        [dir addImportFilePaths:filePaths]; 
     542        [[dir delegate] directoryContentsChanged]; 
     543        [dir resumeImport]; 
     544} 
     545 
     546 
    532547- (void)rescanDirectory:(NSString *)dirPath 
    533548{ 
     549        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    534550        if(![[NSFileManager defaultManager] isDirectory:dirPath]) 
    535551                return; 
     
    540556        dirPath = [dirPath stringByResolvingSymlinksInPath]; 
    541557         
    542         SapphireDirectoryMetaData *dir = [SapphireDirectoryMetaData createDirectoryWithPath:dirPath inContext:moc]; 
     558        NSManagedObjectContext *threadMoc = [SapphireApplianceController newManagedObjectContextForFile:nil]; 
     559        SapphireDirectoryMetaData *dir = [SapphireDirectoryMetaData createDirectoryWithPath:dirPath inContext:threadMoc]; 
    543560        [dir reloadDirectoryContents]; 
    544         [dir resumeImport]; 
     561        NSArray *paths = [dir importFilePaths]; 
     562        [SapphireMetaDataSupport applyChangesFromContext:threadMoc]; 
     563        [threadMoc release]; 
     564        [self performSelectorOnMainThread:@selector(completeRescanOfDir:) withObject:paths waitUntilDone:NO]; 
     565        [pool drain]; 
    545566} 
    546567 
     
    715736} 
    716737 
    717  
    718738- (oneway void)rescanDirectory:(NSString *)dirPath 
    719739{ 
    720740        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    721         [controller performSelectorOnMainThread:@selector(rescanDirectory:) withObject:dirPath waitUntilDone:YES]; 
     741        [NSThread detachNewThreadSelector:@selector(rescanDirectory:) toTarget:controller withObject:dirPath]; 
    722742        [pool drain]; 
    723743} 
  • branches/CoreData/SapphireFrappliance/FRAppliance/SapphireMetaDataUpgrading.m

    r800 r820  
    139139        NSString *v1StoreFile = [applicationSupportDir() stringByAppendingPathComponent:@"metaData.sapphireData"]; 
    140140        NSFileManager *fm = [NSFileManager defaultManager]; 
    141         NSManagedObjectContext *moc = [SapphireApplianceController newManagedObjectContextForFile:nil options:nil]; 
     141        NSManagedObjectContext *moc = [SapphireApplianceController newManagedObjectContextForFile:nil]; 
    142142        @try { 
    143143                if([fm fileExistsAtPath:v1StoreFile]) 
  • branches/CoreData/SapphireFrappliance/FRAppliance/main_helper.m

    r802 r820  
    2424 
    2525@interface NSObject (SapphireApplianceControllerAPI) 
    26 - (NSManagedObjectContext *)newManagedObjectContextForFile:(NSString *)storeFile options:(NSDictionary *)storeOptions; 
     26+ (NSManagedObjectContext *)newManagedObjectContextForFile:(NSString *)storeFile; 
    2727@end 
    2828 
     
    5656         
    5757        NSDictionary *storeOptions = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSReadOnlyPersistentStoreOption, nil]; 
    58         NSManagedObjectContext *moc = [NSClassFromString(@"SapphireApplianceController") newManagedObjectContextForFile:nil options:storeOptions]; 
     58        NSManagedObjectContext *moc = [NSClassFromString(@"SapphireApplianceController") newManagedObjectContextForFile:nil]; 
    5959        [storeOptions release]; 
    6060        if(moc == nil) 
  • branches/CoreData/SapphireFrappliance/MetaData/SapphireMObjects/SapphireDirectoryMetaData.m

    r817 r820  
    8888         
    8989        Basic_Directory_Function_Inits 
     90        importArray = [[NSMutableArray alloc] init]; 
    9091         
    9192        return self; 
     
    273274- (void)rescanDirWithExistingDirs:(NSMutableArray *)existingDirs files:(NSMutableArray *)existingFiles symDirs:(NSMutableArray *)existingSymDirs symFiles:(NSMutableArray *)existingSymFiles; 
    274275{ 
    275         [importArray release]; 
    276         importArray = [[NSMutableArray alloc] init]; 
     276        [importArray removeAllObjects]; 
    277277 
    278278        NSMutableDictionary *dirs = [[NSMutableDictionary alloc] init]; 
  • branches/CoreData/SapphireFrappliance/MetaData/Support/SapphireMetaDataSupport.h

    r801 r820  
    2929 */ 
    3030@interface SapphireMetaDataSupport : NSObject { 
    31         NSTimer                 *writeTimer;            /*!< @brief The timer to agregate writes*/ 
    32         NSTimeInterval  interval;                       /*!< @brief The write interval*/ 
    33         BOOL                    locked;                         /*!< @brief Was the DB locked during the last save*/ 
     31        NSManagedObjectContext  *mainMoc;                       /*!< @brief The main context*/ 
     32        NSTimer                                 *writeTimer;            /*!< @brief The timer to agregate writes*/ 
     33        NSTimeInterval                  interval;                       /*!< @brief The write interval*/ 
     34        BOOL                                    locked;                         /*!< @brief Was the DB locked during the last save*/ 
    3435} 
    3536 
     
    5152 */ 
    5253+ (BOOL)save:(NSManagedObjectContext *)context; 
     54 
     55/*! 
     56 * @brief Save changes in a context in the main context 
     57 * 
     58 * @param context The context with changes to save 
     59 */ 
     60+ (void)applyChangesFromContext:(NSManagedObjectContext *)context; 
     61 
     62/*! 
     63 * @brief Sets the main context 
     64 * 
     65 * @param moc the main context 
     66 */ 
     67+ (void)setMainContext:(NSManagedObjectContext *)moc; 
    5368 
    5469/*! 
  • branches/CoreData/SapphireFrappliance/MetaData/Support/SapphireMetaDataSupport.m

    r801 r820  
    4949- (NSDictionary *)changedValuesWithObjectIDs 
    5050{ 
    51         NSMutableDictionary *ret = [[NSMutableDictionary alloc] initWithDictionary:[self changedValues]]; 
     51        NSDictionary *changedValues = [self changedValues]; 
     52        NSMutableDictionary *ret = [[NSMutableDictionary alloc] initWithDictionary:changedValues]; 
    5253        NSString *key; 
    53         NSEnumerator *keyEnum = [ret keyEnumerator]; 
     54        NSEnumerator *keyEnum = [changedValues keyEnumerator]; 
    5455        while((key = [keyEnum nextObject]) != nil) 
    5556        { 
     
    187188- (void) dealloc 
    188189{ 
     190        [mainMoc release]; 
    189191        [writeTimer invalidate]; 
    190192        writeTimer = nil; 
     
    328330- (BOOL)save:(NSManagedObjectContext *)context; 
    329331{ 
     332        if(context != mainMoc) 
     333        { 
     334                return YES; 
     335        } 
    330336        if(writeTimer == nil) 
    331337        { 
     
    344350         
    345351        return [[SapphireMetaDataSupport sharedInstance] save:context]; 
     352} 
     353 
     354- (void)applyChanges:(NSDictionary *)changes 
     355{ 
     356        [SapphireMetaDataSupport applyChanges:changes toContext:mainMoc]; 
     357} 
     358 
     359- (void)applyChangesFromContext:(NSManagedObjectContext *)context 
     360{ 
     361        if(mainMoc != nil) 
     362        { 
     363                NSDictionary *changes = [SapphireMetaDataSupport changesDictionaryForContext:context]; 
     364                [self performSelectorOnMainThread:@selector(applyChanges:) withObject:changes waitUntilDone:YES]; 
     365        } 
     366} 
     367 
     368+ (void)applyChangesFromContext:(NSManagedObjectContext *)context 
     369{ 
     370        [[SapphireMetaDataSupport sharedInstance] applyChangesFromContext:context]; 
     371} 
     372 
     373- (void)setMainContext:(NSManagedObjectContext *)moc 
     374{ 
     375        [mainMoc release]; 
     376        mainMoc = [moc retain]; 
     377} 
     378 
     379+ (void)setMainContext:(NSManagedObjectContext *)moc 
     380{ 
     381        [[SapphireMetaDataSupport sharedInstance] setMainContext:moc]; 
    346382} 
    347383