1.UserProfileManager
做为整个项目中管理用户entity的类,它封装了很多实用方法,我们可以采用原来的大部分内容,但是要把原demo中Parse相关部分注释掉,自己来完成数据从远程的读取和存储,以及如何存储在本地;
static UserProfileManager *sharedInstance = nil;
@interface UserProfileManager ()
{
NSString *_curusername;
}
@property (nonatomic, strong) NSMutableDictionary *users;
@property (nonatomic, strong) NSString *objectId;
//@property (nonatomic, strong) PFACL *defaultACL;
@end
users数组存在周期为整个APP运行时段,所以可以作为数据缓存,app退出后就释放了,当然你可以在
- (void)loadUserProfileInBackgroundWithBuddy:(NSArray*)buddyList
saveToLoacal:(BOOL)save
completion:(void (^)(BOOL success, NSError *error))completion
方法里写存储到本地数据库的逻辑(FMDB)
这里我来示例一下:
- (void)loadUserProfileInBackground:(NSArray*)userInfos
saveToLoacal:(BOOL)save
completion:(void (^)(BOOL success, NSError *error))completion
{
_users = [NSMutableDictionary dictionary];
for (NSDictionary *dic in userInfos) {
MHJUserProfileEntity *entity = [MHJUserProfileEntity initWithDictionary:dic];
[_users setObject:entity forKey:[NSString stringWithFormat:@"%@",entity.username]];
// NSLog(@"testst:%@",dic);
}
if (save) {//一般来说不用存储到本地,看个人需求了
// NSString *table = [NSString stringWithFormat:@"a%@",USERNAME];//防止以数字开头,所以加个a,数据库中表是不能以数字开头的
// FMDatabase *myUserDB = [FMDatabase databaseWithPath:UserEntityDB_Path];
// if ([myUserDB close]) {
// [myUserDB open];
// }
//
//
// BOOL delete = [myUserDB executeUpdate:DeleteTable(table)];
// if (delete) {
// NSLog(@"成功删除该用户之前entity数据表");
// }else{
// NSLog(@"删除用户表失败");
// }
//
//
//
// NSString *createEntityTable = CreatTable_ForUserEntity(table);
// BOOL FactoryTable = [myUserDB executeUpdate:createEntityTable];
// if(!FactoryTable){
// NSLog(@"创建entity表失败,或许已存在表");
// }else{
// NSLog(@"创建entity表成功");
// }
//
// for (MHJUserProfileEntity *entity in _users.allValues){
//// int imageID;
//// if ([myDic objectForKey:UserEntity_HXInfo] && ![[myDic objectForKey:UserEntity_HXInfo] isKindOfClass:[NSNull class]] && ![[myDic objectForKey:UserEntity_HXInfo] isEqualToString:@""]) {
//// NSString *jsonString = [myDic objectForKey:UserEntity_HXInfo];
//// NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
//// NSError *err;
//// NSDictionary *infoDic = [NSJSONSerialization JSONObjectWithData:jsonData
//// options:NSJSONReadingMutableContainers
//// error:&err];
//// if(err) {
//// NSLog(@"json解析失败:%@",err);
//// }
////
//// if ([infoDic objectForKey:UserEntity_ImageId] && ![[infoDic objectForKey:UserEntity_ImageId] isKindOfClass:[NSNull class]]) {
//// imageID = [[infoDic objectForKey:UserEntity_ImageId] intValue];
//// }else{
//// imageID = 0;
//// }
//// }
//
// BOOL res = [myUserDB executeUpdate:InsertTable_ForUserEntity(table,entity.userId,entity.sex,entity.imageUrl,entity.email,entity.username,entity.imageID,entity.nickname,entity.describe]);
// if (!res) {
// NSLog(@"插入document数据库成功");
// }
// }
// [myUserDB close];
}
if (self.users != nil) {
if (completion) {
completion(YES,nil);
}
}
NSLog(@"缓存数据成功");
}
上面的常量字符串我定义成了宏方法
#define UserEntityDB_Path [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"/test.db"]
//判断表是否存在 - A 为表名
#define ExistTable(Table) [NSString stringWithFormat:@"select count(*) as 'count' from sqlite_master where type ='table' and name = %@_Table",Table]
//删除表
#define DeleteTable(Table) [NSString stringWithFormat:@"delete from %@_Table",Table]
//创建表
#define CreatTable_ForUserEntity(Table) [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@_Table (id INTEGER PRIMARY KEY,sex INTEGER,imageUrl TEXT,email TEXT,username TEXT,imageID INTEGER,usertitle TEXT,discription TEXT) ",Table]
//查找表
#define SelectTable_WhereUsername(Table,Username) [NSString stringWithFormat:@"SELECT * FROM %@_Table where username = %@",Table,Username]
//向表中插入数据
#define InsertTable_ForUserEntity(Table,A,B,C,D,E,F,G,H) [NSString stringWithFormat:@"insert into %@_Table(id,sex,imageUrl,email,username,imageID,usertitle,discription)values(%d,%d,'%@','%@','%@',%d,'%@','%@')",Table,A,B,C,D,E,F,G,H]
1.1 UserProfileEntity
在UserProfileManager里面声明了这个类,你可以自定义用户实体的属性如:
@interface UserProfileEntity : NSObject
+ (instancetype)initWithPFObject:(PFObject*)object;
@property (nonatomic,strong) NSString *objectId;
@property (nonatomic,strong) NSString *username;
@property (nonatomic,strong) NSString *nickname;
@property (nonatomic,strong) NSString *imageUrl;
@end
看自己的要求了。总之各种与用户数据相关的逻辑都可以写在这个类里;
2.ChatDemoHelper - 重要
这个类在整个环信项目中是最非常重要的,里面实现了大量的回调逻辑,比如收到消息,收到好友请求,收到静默消息(cmd消息),发送语音邀请等等;如果你想在接收到这些操作的同时相应事件,就得在这里写;(你可以换个符合你项目的名字 例如:TestHelper )
点开.m文件,方法名很易懂:
各种逻辑它都写好了,你可以仿写;
3.AppDelegate+EaseMob
用于处理SDK注册设置等相关逻辑,你只需要按他的来就行了;
4.出现:CopyPNGFile 异常错误
出现这种情况项目还是能够编译运行的
大部分原因是因为你项目中存在了多个这样的文件,删除,只留一个就行了;如果只有一个,那就是格式问题了
5.Decoder_Interface_init()崩溃错误
在环信UI3.0中,使用了音频转码
opencore-amrnb
opencore-amrwb
如果出现这个问题,一般是你独立集成一个环信测试demo,运行正常,但是当你集成到你公司项目中时,就崩溃了,这是静态库冲突的问题,我自己也没解决,如果静态库中同用了一个“工具”,但是是不同版本,那就会导致。
6.Library Search Path 的设置问题
如果对这方面比较熟悉,这段就用看了;
我们需要导入SDK和视频解码的静态库,一般来说Xcode会帮我们自动设置静态库的路径,但是如果出现:ld: library not found for xxxxx 的问题,那就是静态库路径错误了
我们找到静态库文件直接拖入:
拖入到$(inherited)的下方:
这里可以去掉引号,这样只导入了一个静态库,如果该文件下有多个静态库文件,你只需要导入该文件的路径就行了;
此外路径右边的 non-recursive 表示不检查这个文件下子目录所包含的静态库
如果设置为recursive,你直接写上工程总目录,静态库能够自动全部导入的;
7.便捷的显示方式[self showHint:@”提示信息”]
在环信中,使用了MBProgressHUD工具,其中方便快捷的显示提示框的方式来自分类:
使用者可以使用这种快捷方式,很方便,当然,这些我们也可以自己写某个工具类里面调用这些方法
有问题可以提问,我正愁没东西写,因为想不到