Получите уведомление, когда NSOperationQueue закончит все задачи

Репозиторий - это более абстрактный термин, ориентированный на домен, который является частью доменного дизайна, он является частью дизайна вашего домена и общего языка, DAO - это техническая абстракция для технологии доступа к данным, репозиторий касается только управления существующими данными и фабриками. для создания данных.

проверьте эти ссылки:

http://warren.mayocchi.com/2006/07/27/repository-or-dao/ http: // fabiomaulo. blogspot.com/2009/09/repository-or-dao-repository.html

89
задан skaffman 15 November 2009 в 19:49
поделиться

5 ответов

Используйте KVO для наблюдения за свойством operations вашей очереди, затем вы можете узнать, завершилась ли ваша очередь, проверив [queue.operations count] == ​​0 .

Где-нибудь в файле, в котором вы выполняете KVO, объявите контекст для KVO следующим образом ( подробнее ):

static NSString *kQueueOperationsChanged = @"kQueueOperationsChanged";

При настройке очереди сделайте следующее:

[self.queue addObserver:self forKeyPath:@"operations" options:0 context:&kQueueOperationsChanged];

Затем выполните это в вашем ObservationValueForKeyPath :

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
                         change:(NSDictionary *)change context:(void *)context
{
    if (object == self.queue && [keyPath isEqualToString:@"operations"] && context == &kQueueOperationsChanged) {
        if ([self.queue.operations count] == 0) {
            // Do something here when your queue has completed
            NSLog(@"queue has completed");
        }
    }
    else {
        [super observeValueForKeyPath:keyPath ofObject:object 
                               change:change context:context];
    }
}

(Предполагается, что ваша NSOperationQueue находится в свойстве с именем queue )

В какой-то момент до того, как ваш объект полностью deallocs (или когда он перестанет заботиться о состоянии очереди), вам необходимо отменить регистрацию в KVO следующим образом:

[self.queue removeObserver:self forKeyPath:@"operations" context:&kQueueOperationsChanged];


Приложение: iOS 4.0 имеет свойство NSOperationQueue.operationCount , которое, согласно документации, является Соответствует KVO. Однако этот ответ по-прежнему будет работать в iOS 4.0, поэтому он по-прежнему полезен для обратной совместимости.

164
ответ дан 24 November 2019 в 07:12
поделиться

Вы можете создать новый NSThread или выполнить селектор в фоновом режиме и ждать там. Когда NSOperationQueue завершится, вы можете отправить собственное уведомление.

Я думаю о чем-то вроде:

- (void)someMethod {
    // Queue everything in your operationQueue (instance variable)
    [self performSelectorInBackground:@selector(waitForQueue)];
    // Continue as usual
}

...

- (void)waitForQueue {
    [operationQueue waitUntilAllOperationsAreFinished];
    [[NSNotificationCenter defaultCenter] postNotification:@"queueFinished"];
}
0
ответ дан 24 November 2019 в 07:12
поделиться

Как насчет добавления NSOperation который зависит от всех остальных, поэтому он будет работать последним?

17
ответ дан 24 November 2019 в 07:12
поделиться

Как насчет использования KVO для наблюдения за свойством operationCount очереди? Тогда вы услышите об этом, когда очередь станет пустой, а также когда она перестанет быть пустой. Работать с индикатором прогресса можно так же просто, как просто сделать что-то вроде:

[indicator setHidden:([queue operationCount]==0)]
2
ответ дан 24 November 2019 в 07:12
поделиться

Вот как я это делаю.

Настройте очередь и зарегистрируйте изменения в свойство операций:

myQueue = [[NSOperationQueue alloc] init];
[myQueue addObserver: self forKeyPath: @"operations" options: NSKeyValueObservingOptionNew context: NULL];

... и наблюдатель (в данном случае self ) реализует:

- (void) observeValueForKeyPath:(NSString *) keyPath ofObject:(id) object change:(NSDictionary *) change context:(void *) context {

    if (
        object == myQueue
        &&
        [@"operations" isEqual: keyPath]
    ) {

        NSArray *operations = [change objectForKey:NSKeyValueChangeNewKey];

        if ( [self hasActiveOperations: operations] ) {
            [spinner startAnimating];
        } else {
            [spinner stopAnimating];
        }
    }
}

- (BOOL) hasActiveOperations:(NSArray *) operations {
    for ( id operation in operations ) {
        if ( [operation isExecuting] && ! [operation isCancelled] ) {
            return YES;
        }
    }

    return NO;
}

В этом примере «счетчик» - это UIActivityIndicatorView , показывающий, что что-то происходит . Очевидно, вы можете переодеться в костюм ...

5
ответ дан 24 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: