dismissModalViewController не работает при постановке в очередь в главной очереди - PullRequest
0 голосов
/ 20 июня 2011

У меня проблемы с удалением modalviewcontroller из фоновой очереди.Вот код

- (void)cleanUpPictures
{
    dispatch_queue_t queue = dispatch_queue_create("ch.thurboapp.cleanup", NULL);
    dispatch_async(queue, ^{
        NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
        [context setPersistentStoreCoordinator:[self.managedObjectContext persistentStoreCoordinator]];
        //register for core data save notification
        [[NSNotificationCenter defaultCenter] addObserver:self 
                                                 selector:@selector(mergeChanges:)
                                                     name:NSManagedObjectContextDidSaveNotification
                                                   object:context];
        [self deleteAllObjects:@"Thumbnail" inContext:context];
        [self deleteAllObjects:@"MenuThumbnail" inContext:context];
        [self deleteAllObjects:@"PictureData" inContext:context];
        [context release];
        dispatch_async(dispatch_get_main_queue(), ^{
            [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:LastCleaned];
            [[NSUserDefaults standardUserDefaults] synchronize];
            [self.parentViewController dismissModalViewControllerAnimated:YES];
        });
    });
    dispatch_release(queue);
}

[self.parentViewController dismissModalViewControllerAnimated:YES];

вызывается внутри основного потока, но без эффекта.Кто-то знает решение этой проблемы?

Помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 30 июля 2011

Попробуйте использовать диспетчерскую группу, чтобы уведомить вас о завершении первого блока работы:

- (void)cleanUpPictures
{
    dispatch_queue_t queue = dispatch_queue_create("ch.thurboapp.cleanup", NULL);
    // To know when we're done, we need to associate work in this queue
    // with a group
    dispatch_group_t group = dispatch_group_create();

dispatch_group_async(group, queue, ^{
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
    [context setPersistentStoreCoordinator:[self.managedObjectContext persistentStoreCoordinator]];
    //register for core data save notification
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(mergeChanges:)
                                                 name:NSManagedObjectContextDidSaveNotification
                                               object:context];
    [self deleteAllObjects:@"Thumbnail" inContext:context];
    [self deleteAllObjects:@"MenuThumbnail" inContext:context];
    [self deleteAllObjects:@"PictureData" inContext:context];
    [context release];
});

// When the last block of work in this group finishes
// dispatch_group_notify fires
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:LastCleaned];
        [[NSUserDefaults standardUserDefaults] synchronize];
        [self.parentViewController dismissModalViewControllerAnimated:YES];
    });

dispatch_release(queue);
dispatch_release(group);
}
0 голосов
/ 20 июня 2011

Я не слишком знаком с тем, как код пользовательского интерфейса взаимодействует внутри блоков, но вы пробовали использовать более простой метод executeSelectorOnMainThread?

...