Репозиторий - это более абстрактный термин, ориентированный на домен, который является частью доменного дизайна, он является частью дизайна вашего домена и общего языка, DAO - это техническая абстракция для технологии доступа к данным, репозиторий касается только управления существующими данными и фабриками. для создания данных.
проверьте эти ссылки:
http://warren.mayocchi.com/2006/07/27/repository-or-dao/ http: // fabiomaulo. blogspot.com/2009/09/repository-or-dao-repository.html
Используйте 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, поэтому он по-прежнему полезен для обратной совместимости.
Вы можете создать новый 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"];
}
Как насчет добавления NSOperation который зависит от всех остальных, поэтому он будет работать последним?
Как насчет использования KVO для наблюдения за свойством operationCount
очереди? Тогда вы услышите об этом, когда очередь станет пустой, а также когда она перестанет быть пустой. Работать с индикатором прогресса можно так же просто, как просто сделать что-то вроде:
[indicator setHidden:([queue operationCount]==0)]
Вот как я это делаю.
Настройте очередь и зарегистрируйте изменения в свойство операций:
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
, показывающий, что что-то происходит . Очевидно, вы можете переодеться в костюм ...