Помогите мне здесь или просто пролить свет на проблему.Уведомление NSOperationQueue
У меня есть сценарий, в котором я выполняю синхронизацию архивных сообщений на сервере openfire, и я обрабатываю и сохраняю все входящие сообщения с NSOperation
и NSOperationQueue
.
Я хочу получить уведомление, когда сделано NSOperationQueue
, но я не могу просто подсчитать количество выполняемых операций. Время от времени NSOperationQueue
имеет 0 операций, потому что это зависит от данных, которые необходимо получить от сервера.
Методы NSOperations
начала
- (void)startArchiveSyncStore:(XMPPIQ *)iq operationID:(NSString *)xmlID {
@autoreleasepool {
if (![self.pendingOperations.archiveStoreInProgress.allKeys containsObject:xmlID]) {
ArchiveStoreOperation *storeOperation = [[ArchiveStoreOperation alloc] initWithMessagesToArchive:iq withID:xmlID delegate:self];
[self.pendingOperations.archiveStoreInProgress setObject:storeOperation forKey:xmlID];
[self.pendingOperations.archiveStoreQueue addOperation:storeOperation];
}
}
}
- (void)startArchiveSycnDownload:(XMPPIQ *)iq operationID:(NSString *)xmlID {
@autoreleasepool {
if (![self.pendingOperations.archiveDownloadInProgress.allKeys containsObject:xmlID]) {
ArchiveDownloadOperation *downloadOperation = [[ArchiveDownloadOperation alloc] initWithMessagesToDownload:iq withID:xmlID delegate:self];
[self.pendingOperations.archiveDownloadInProgress setObject:downloadOperation forKey:xmlID];
[self.pendingOperations.archiveDownloadQueue addOperation:downloadOperation];
}
}
}
И это главный обратный вызов резьбы в исполнении NSOperation
:
- (void)archiveStoreDidFinish:(ArchiveStoreOperation *)downloader {
NSString *xmlID = downloader.xmlnsID;
DDLogInfo(@"%@ %@", THIS_METHOD, xmlID);
[self.pendingOperations.archiveStoreInProgress removeObjectForKey:xmlID];
}
Эти операции начинаются, когда я получаю Iq строфы, содержащие списки истории чата из openfire server. Затем я обрабатываю эти списки следующим образом:
- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq {
if ([iq isResultIQ]) {
if ([iq elementForName:@"list" xmlns:@"urn:xmpp:archive"]) {
[self startArchiveSycnDownload:iq operationID:[[iq attributeForName:@"id"] stringValue]];
}
if ([iq elementForName:@"chat" xmlns:@"urn:xmpp:archive"]) {
[self startArchiveSyncStore:iq operationID:[[iq attributeForName:@"id"] stringValue]];
}
}
return NO;
}
Любые идеи? Спасибо заранее ...
В очереди нет операций и больше сообщений с сервера, выделяющих новые операции. Операции выделяются сообщениями, поэтому я никогда не узнаю, когда они будут сделаны. Мне нравится операция завершения как зависимость, я буду изучать это. –
Как узнать, есть ли еще сообщения, поступающие с сервера? –
Я предполагаю, что если проверка '- (BOOL) xmppStream: (XMPPStream *) didReceiveIQ: (XMPPIQ *) iq;' метод не вызывается? –