自己封装的一套基于苹果coreData的网络框架,很好用!
苹果系统生成的模板中已经把 Core Data 的基础准备都放在 AppDelegate 中了,为什么还要自己封装?
Core Data 的核心对象都不是线程安全的,封装此框架之前,需要先了解一下的类:
单例的实现
+(instancetype)shareManager{static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{instance = [[self alloc] init];
});
return instance;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [super allocWithZone:zone];
});
return instance;
}
// 重写init方法
(instancetype)init
{
self = [super init];
if (self) {
[self managedObjectContext];
}
return self;
}
单例方法中什么时候需要实现 allocWithZone: 方法?
* 利用 @synthesize 指定成员变量
- // 创建一个只读上下文本属性
- @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
- @synthesize managedObjectContext = _managedObjectContext;
- - (NSManagedObjectContext *)managedObjectContext {
- // 返回已经绑定到`持久化存储调度器`的管理对象上下文
- if (_managedObjectContext != nil) {
- return _managedObjectContext;
- }
- // 数据模型的 URL
- NSURL *modelURL = [[NSBundle mainBundle] URLForResource:modelName withExtension:@"momd"];
- // 从 Bundle 加载对象模型
- NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
- // 创建持久化存储调度器
- NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
- // 指定保存在磁盘的数据库文件 URL
- NSURL *applicationURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
- NSURL *storeURL = [applicationURL URLByAppendingPathComponent:dbName];
- if ([psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:NULL] == nil) {
- NSLog(@"创建数据库错误");
- return nil;
- }
- // 创建管理对象上下文,并且指定并发类型
- _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
- // 设置管理上下文的存储调度器
- [_managedObjectContext setPersistentStoreCoordinator:psc];
- return _managedObjectContext;
- }
(BOOL)saveContext{
// 判断上下文是否为 nil
if (self.managedObjectContext == nil) {
NSLog(@"上下文为nil,无法进行数据操作");
return NO;
}
NSError *error = nil;
if (self.managedObjectContext.hasChanges && ![self.managedObjectContext save:&error]) {
NSLog(@"没有需要保存的数据");
return NO;
}
[self.backgroundMoc save:NULL];
return YES;
}