gpt4 book ai didi

ios - 更新模型类中的核心数据

转载 作者:行者123 更新时间:2023-11-28 19:06:19 26 4
gpt4 key购买 nike

在何处更新我的核心数据的最佳做法是什么?

我现在正在工作的这个项目的第一个工作人员在 ViewController 中创建了所有与核心数据相关的函数,但我想在模型类(NSManagedObject 子类)中声明它们以分离关注点。

主要功能是调用 Web 服务并返回要添加/编辑/删除的对象数组的 AFNetworking postPath。我所做的是创建一个类方法并在其中执行此 AFNetwork 调用:

+ (void)updateEbooksListWithSuccessBlock:(void (^)())successBlock andFailureBlock:(void (^)())failureBlock {
NSURL *url = urlSchema (urlWebServices, @"");
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];

NSString *postPath = [NSString stringWithFormat:@"ws-ebooks-lista.php"];

[httpClient postPath:postPath parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

if ([operation isKindOfClass:[AFHTTPRequestOperation class]]) {
NSDictionary *result = [[responseObject objectFromJSONData] retain];
bool success = statusDoRetornoDoWebService(result); //Function that checks if the return was successful

//Configura o Core Data
NSError *error = nil;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSManagedObjectContext *localManagedObjectContext = [[NSManagedObjectContext alloc] init];
[localManagedObjectContext setParentContext:[(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Ebooks" inManagedObjectContext:localManagedObjectContext];
NSPredicate *filterPredicate;

[request setEntity:entity];

if (success) {
NSArray *ebookInfos = [result objectForKey:@"saida"];
Ebooks *ebook;
NSManagedObject *objectInsert;

for (NSDictionary* ebookInfo in ebookInfos) {

filterPredicate = [NSPredicate predicateWithFormat:@"ebooks_id == %@",[ebookInfo valueForKey:@"id_ebook"]];
[request setPredicate:filterPredicate];
ebook = [[localManagedObjectContext executeFetchRequest:request error:&error] lastObject];
objectInsert = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:localManagedObjectContext];

if (ebook) {
if (![[ebookInfo valueForKey:@"excluido"] isEmpty]) {
//Delete Ebook
} else {
//Update Ebook
}
} else {
//Add Ebook
}

if (![localManagedObjectContext save:&error]) {
//Log Error
}

[objectInsert release];
}

}

[request release];
[localManagedObjectContext release];
}

[successBlock invoke];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
//Failure

[failureBlock invoke];
}];}

它在应用程序运行时工作正常,但如果我关闭它(通过 Xcode)并再次打开它,则不会保存更改。我尝试不使用“父上下文”方式而只使用 AppDelegate 托管对象上下文(因为 AFNetworking 回调始终在主队列上运行)但没有成功:数据没有持久化。这是为什么?难道我做错了什么?这是不好的做法吗?我应该将 View Controller 中的所有内容保持原样吗?

谢谢!

最佳答案

我认为将太多最终与您的数据模型相关的逻辑放入您的实体类中是个坏主意。这些任务根本不属于那里。实体类应该只关注它们封装的内容:实体实例本身。

为了说明:考虑一个表示数字的类(如 NSNumber)。它认为将它扩展为给你一个特定限制内的所有偶数数组或斐波那契数列的第 n 个成员是不方便的。让数字类负责将自身保存到文件或从 Web 检索信息似乎是不合理的。

出于这些和类似的原因,我相信核心数据实体的获取和保存属于 Controller ,而不是实体类。请记住,MVC(模型- View - Controller )模式背后的基本思想之一是 Controller 操纵模型或向其询问信息,而不是模型操纵自身。

我推测您的问题主要源于没有充分分离应用程序的各个功能方面(数据模型、持久性、网络操作、用户交互)。

关于ios - 更新模型类中的核心数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20152008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com