代码之家  ›  专栏  ›  技术社区  ›  user3358463

使用核心数据管理XMPP用户

  •  0
  • user3358463  · 技术社区  · 10 年前

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

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

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

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

    1. 我无法从核心数据获取JUser的id
    2. 如果我这样做1。我可以将他的网络图像和数据设置为他的核心数据的传奇账户。-我认为这不是个好主意。我如何在这里管理用户?

    一些代码:

    - (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 回复  |  直到 10 年前
        1
  •  0
  •   Robert B. Weeks    10 年前

    上面显示的是跟踪/获取XMPP服务器的花名册请求填充的信息(无论是自动获取还是使用XMPPRoster“fetchRoster”方法手动获取(假设您设置了CoreData存储花名册数据的方式,而不是内存)。

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

    例如,在XMPPRoster.didReceiveIQ()中,可以看到对“[xmppStorage handleRosterItem:item xmppStream:xmppStream]”的调用。这是处理

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

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