如之前所說饵较,建議建立一個(gè)XMPPStream單例對(duì)象,然后再在這個(gè)單例對(duì)象中進(jìn)行模塊添加,當(dāng)然使用其他你認(rèn)為合適的方式進(jìn)行下面的模塊添加也是OK的
如果你是用pod初始化的項(xiàng)目,那么在項(xiàng)目中的XMPPFramework文件夾下可以直接看到Roster目錄
1门岔,導(dǎo)入頭文件
#import "XMPPRoster.h"
#import "XMPPRosterCoreDataStorage.h"
2, 模塊添加
//花名冊(cè)模塊
_rosterStorage = [XMPPRosterCoreDataStorage sharedInstance];
_roster = [[XMPPRoster alloc] initWithRosterStorage:self.rosterStorage];
[self.roster activate:_xmppStream];
3烤送,花名冊(cè)模塊使用:
如果需要使用模塊寒随,需要把模塊相應(yīng)的對(duì)象暴漏到頭文件中方便我們之后調(diào)用
在本模塊中需要暴漏的是XMPPRoster對(duì)象和XMPPRosterCoreDataStorage,前者用來設(shè)置代理以監(jiān)聽好友請(qǐng)求等帮坚,后者需要用來獲取數(shù)據(jù)上下文妻往,進(jìn)行數(shù)據(jù)查詢,具體如下:
//3.1, 從數(shù)據(jù)庫中取值(CoreData數(shù)據(jù)庫文件在工程中是在XMPPFramework文件夾下的Resources文件夾里)
//1试和,獲取上下文讯泣,可以直接從rosterStorage中獲取
NSManagedObjectContext *context = [IMStream sharedStream].rosterStorage.mainThreadManagedObjectContext;
//2,創(chuàng)建請(qǐng)求并設(shè)置過濾條件以及排序等
//注意:所有當(dāng)前用戶的好友的streamBareJidStr字段內(nèi)容都是當(dāng)前用戶的jid字符串
//這個(gè)是需要查詢的表:XMPPUserCoreDataStorageObject
NSString *account = [[NSUserDefaults standardUserDefaults] objectForKey:@"account"];
NSString *jid = [NSString stringWithFormat:@"%@@192.168.0.2", account];
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"XMPPUserCoreDataStorageObject"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"streamBareJidStr = %@",jid];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"displayName" ascending:YES];
request.predicate = predicate;
request.sortDescriptors = @[sortDescriptor];
/*
//第一種執(zhí)行請(qǐng)求的方式是CoreData的方式阅悍,這種方式是不能實(shí)時(shí)監(jiān)聽好友列表的改變的
NSError *error;
self.contacts = [context executeFetchRequest:request error:&error];
*/
//3.1,第二種是用XMPP提供的執(zhí)行請(qǐng)求方式好渠,可以實(shí)時(shí)監(jiān)聽好友添加刪除變化
self.fetchController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
//3.2昨稼,設(shè)置代理方便監(jiān)聽
self.fetchController.delegate = self;
//3.3,真正的執(zhí)行請(qǐng)求得到數(shù)據(jù)
NSError *error;
[self.fetchController performFetch:&error];
if (error) {
NSLog(@"%@",error);
}
- 3.2拳锚,解析查詢的結(jié)果
//如果沒有錯(cuò)誤假栓,說明請(qǐng)求正確,那么就可以拿到請(qǐng)求到的數(shù)組結(jié)果了
NSLog(@"%@",self.fetchController.fetchedObjects);
//下面是取出第一個(gè)內(nèi)容的例子
XMPPUserCoreDataStorageObject *userObject = self.fetchController.fetchedObjects[0];
- 3.3霍掺,在合適的位置進(jìn)行了數(shù)據(jù)的查詢之后就可以進(jìn)行數(shù)據(jù)變化的監(jiān)聽了
//代理方式監(jiān)聽請(qǐng)求內(nèi)容的變化匾荆,我這里是進(jìn)行刷洗了表格內(nèi)容
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller{
NSLog(@"數(shù)據(jù)發(fā)生變化:添加了好友或者被好友刪除了等");
[self.tableView reloadData];
}
- 3.4,監(jiān)聽好友添加請(qǐng)求,需要設(shè)置XMPPRoster代理為自己杆烁,然后實(shí)現(xiàn)監(jiān)聽方法即可牙丽,監(jiān)聽方法如下:
-(void)xmppRoster:(XMPPRoster *)sender didReceivePresenceSubscriptionRequest:(XMPPPresence *)presence{
NSLog(@"接受到好友請(qǐng)求");
}
4,釋放模塊兔魂,當(dāng)你不需要再使用這個(gè)模塊的時(shí)候可以釋放掉這個(gè)模塊(在單例中貌似沒有這個(gè)必要烤芦,可以在控制器死亡的時(shí)候進(jìn)行釋放,具體放在那里看具體情況)
//首先凍結(jié)模塊
[_roster deactivate];
//然后把對(duì)象設(shè)置為nil
_rosterStorage = nil;
_roster = nil;