使用Core Data管理XMPP用户

时间:2014-03-09 12:29:23

标签: ios iphone core-data xmpp xmppframework

我正在制作聊天应用程序,我正在寻找从核心数据中保存和加载的方法。 我保存并加载所有用户的历史记录,它运行良好。

我正在寻找如何加载和保存名册列表的方式

我不确定。我在启动时通过从名单列表中获取用户的ID来从web加载用户的信息,并请求该用户的信息的Web服务。我想用名单列表将其保存到核心数据中。

如何为每个jUser(从核心数据加载)设置他的Web服务器信息?这里有两个问题:

  1. 我无法从核心数据中获取JUser的ID
  2. 如果我这样做1.我可以将该用户的Web图像和数据设置为其核心数据的传真帐户。 - 我认为这不是一个好主意。我如何在这里管理用户?
  3. 一些代码:

    - (NSFetchedResultsController *)fetchedResultsController
    {
    if (_fetchedResultsController == nil)
    {
        NSManagedObjectContext *moc = [[self appDelegate] managedObjectContext_roster];
    
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPUserCoreDataStorageObject"
                                                  inManagedObjectContext: moc];
    
        NSSortDescriptor *sd1 = [[NSSortDescriptor alloc] initWithKey:@"sectionNum" ascending:YES];
        NSSortDescriptor *sd2 = [[NSSortDescriptor alloc] initWithKey:@"displayName" ascending:YES];
    
        NSArray *sortDescriptors = [NSArray arrayWithObjects: sd1, sd2, nil];
    
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        [fetchRequest setEntity:entity];
        [fetchRequest setSortDescriptors:sortDescriptors];
        [fetchRequest setFetchBatchSize:10];
    
        _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                        managedObjectContext:moc
                                                                          sectionNameKeyPath:@"sectionNum"
                                                                                   cacheName:nil];
        [_fetchedResultsController setDelegate:self];
    
    
        NSError *error = nil;
        if (![_fetchedResultsController performFetch:&error])
        {
            //DDLogError(@"Error performing fetch: %@", error);
        }
    
    }
    
    return _fetchedResultsController;
    }
    

1 个答案:

答案 0 :(得分:0)

上面显示的是跟踪/获取使用XMPP服务器为其命名填充的信息(无论是autoFetch还是使用XMPPRoster'fetchRoster'方法手动获取(假设您已设置)存储名册数据的CoreData方式,而非内存)。

一旦返回对名册提取的响应(iq结果),XMPPRoster实例中的委托将捕获并使用给定的存储选项放置。如果您使用的服务器符合XMPP rfc,那么这应该在返回时自动发生。

例如 - 在XMPPRoster.didReceiveIQ()中 - 您可以看到对'[xmppStorage handleRosterItem:item xmppStream:xmppStream]'的调用。这是处理过的地方

您可以在此处扩展存储(例如,XMPPRosterCoreDataStorage和XMPPUserCoreDataStorage)并设置到位以向实体添加其他信息。例如,此处 - XMPPUserCoreDataStorage具有覆盖'(void)didUpdateWithItem:(NSXMLElement *)item',您可以将属性定义为指向另一个实体。在这里,您将复制现有的数据模型并添加自己的属性 - 使用上面的覆盖来输入它们。

至于消息,取决于MUC还是1:1 - 但它们也使用不同的管理对象。 XEP-0045是存储您可以尝试附加到那里的用户最后一条消息的MUC消息的内容 - 以及用于1:1存储的XMPPMessageArchiving,但是如果需要,您仍然需要服务器上的支持持续捕获另一个用户的最后一条消息 - 除非你只是谈论每个会话(然后你可以在本地存储以供显示)。