///////////////////////////在 AppDelegate中///////////////////////////
注册花名模块:
/** * 链接到 xmpp 服务器 */
- (void)connect{
if (self.xmppStream == nil) {
// 1.初始化 xmppstream
self.xmppStream = [[XMPPStream alloc] init];
// 2.添加电子名片模块
// 2.1创建电子名片的数据存储
self.vCardStorage = [XMPPvCardCoreDataStorage sharedInstance];
// 2.2根据名片的数据存储创建电子名片模块
self.vCard = [[XMPPvCardTempModule alloc] initWithvCardStorage:self.vCardStorage];
// 2.3用 xmppstream 激活名片
[self.vCard activate:self.xmppStream];
// 电子名片配和头像模块一起使用
// 3.添加头像模块
// 3.1根据电子名片创建头像模块
self.avatar = [[XMPPvCardAvatarModule alloc] initWithvCardTempModule:self.vCard];
// 激活头像模块
[self.avatar activate:self.xmppStream];
// 4.添加花名册模块
self.rosterStorage = [XMPPRosterCoreDataStorage sharedInstance];
self.roster = [[XMPPRoster alloc] initWithRosterStorage:self.rosterStorage];
[self.roster activate:self.xmppStream];
// 设置代理,发到子线程中执行
[self.xmppStream addDelegate:self delegateQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
}
// 链接之前要判断是都链接成功,否则会出现用上一次的 jid 重复链接的错误
if (![self.xmppStream isConnected]) {
// 设置 xmppstream 的 myJID hostName hostPort 默认的5222可以不用设置
self.xmppStream.myJID = [XMPPJID jidWithUser:@"zhangsan" domain:@"127.0.0.1" resource:nil];
self.xmppStream.hostName = @"127.0.0.1";
// 开始链接
NSError * error = nil;
if (![self.xmppStream connectWithTimeout:XMPPStreamTimeoutNone error:&error]) {
NSLog(@"%@",[error userInfo].description);
}
}
}
释放资源
// 在 dealloc 中调用
- (void)teardownStream
{
// 移除代理
[self.xmppStream removeDelegate:self];
// 取消模块
[self.vCard deactivate];
[self.avatar deactivate];
[self.roster deactivate];
// 断开链接
[self.xmppStream disconnect];
// 清空资源
self.roster = nil;
self.rosterStorage = nil;
self.vCardStorage = nil;
self.vCard = nil;
self.avatar = nil;
self.xmppStream = nil;
}
///////////////////////////MeTableViewController///////////////////////////
好友列表的获取,添加,删除
@interface MeTableViewController ()<NSFetchedResultsControllerDelegate>
@property (strong,nonatomic) NSFetchedResultsController * resultsController;
@end
/** * 获取好友的结果集 */
- (void)loadUser
{
// 1.上下文
NSManagedObjectContext *rosterContext = [[AppDelegate alloc] init].rosterStorage.mainThreadManagedObjectContext;
// 2.请求查询
NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"XMPPUserCoreDataStorageObject"];
// 3.设置排序
NSSortDescriptor * sort = [NSSortDescriptor sortDescriptorWithKey:@"displayName" ascending:YES];
request.sortDescriptors = @[sort];
self.resultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:rosterContext sectionNameKeyPath:nil cacheName:nil];
self.resultsController.delegate = self;
NSError * error = nil;
[self.resultsController performFetch:&error];
NSLog(@"%@",[[error userInfo] description]);
}
/** * 添加好友 */
- (void)addRoster:(NSString*)userName
{
// 不能添加自己为好友
// 不能添加已经存在的好友
XMPPJID * userJid = [XMPPJID jidWithUser:userName domain:@"127.0.0.1" resource:nil];
AppDelegate * delegate = [[AppDelegate alloc] init];
// 判断是否已经存的好友
BOOL userExits = [delegate.rosterStorage userExistsWithJID:userJid xmppStream:delegate.xmppStream];
if (!userExits) {
// 添加好友(订阅)
[delegate.roster subscribePresenceToUser:userJid];
}
}
#pragma mark -结果控制器的代理
#pragma mark -数据库内容改变
-(void)controllerDidChangeContent:(NSFetchedResultsController *)controller{
[self.tableView reloadData];
}
#pragma mark - Table view data source
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// 结果集数组中的元素
return self.resultsController.fetchedObjects.count;
}
/** * 获取好友列表 */
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString * ID = @"cell";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell==nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
}
// 获取好友列表
XMPPUserCoreDataStorageObject *user = self.resultsController.fetchedObjects[indexPath.row];
cell.textLabel.text= user.displayName;
if (user.photo) { // 先从本地数据库中取数据
cell.imageView.image = user.photo;
}else{ // 从服务器上取数据
NSData * imagedata = [[[AppDelegate alloc] init].avatar photoDataForJID:user.jid];
cell.imageView.image = [UIImage imageWithData:imagedata];
}
return cell;
}
/** * 删除好友 */
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
XMPPUserCoreDataStorageObject *user = self.resultsController.fetchedObjects[indexPath.row];
if (editingStyle == UITableViewCellEditingStyleDelete) {
// 删除好友列表
[[[AppDelegate alloc] init].roster removeUser:user.jid];
}
}