为了测试托管类,我尝试在单元测试中创建一个实例,首先尝试模拟NSEntityDescription和NSManagedObjectContext.
id mockEntityDesc = [OCMockObject niceMockForClass:[NSEntityDescription class]];
id mockManagedObjectContext = [OCMockObject mockForClass:NSManagedObjectContext.class];
Run Code Online (Sandbox Code Playgroud)
但在我进一步研究之前,我在测试运行时遇到以下错误;
体系结构i386的未定义符号:"_ OBJC_CLASS _ $ _ NSEntityDescription",引自:CallsCoordinatorTests.o中的objc-class-ref"_OBJC_CLASS _ $ _ NSManagedObjectContext",引自:CallsCoordinatorTests.o中的objc-class-ref ld:未找到符号对于体系结构i386 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
有什么建议吗?谢谢
objective-c ocmock nsmanagedobjectcontext ios nsentitydescription
我Transaction在我的Core Data应用程序中添加了一些名为s的对象.这些交易与帐户相关联.
我想在保存所有交易时更新帐户金额.有时会出现并发异常
"收集在被列举时发生变异"
NSArray *matches = [managedObjectContext executeFetchRequest:request error:&error];在accountManagedObjectWithId方法中排队.
//TransactionsManager
- (BOOL)addRepeatTransaction:(Transaction *)transaction{
Account *accountTrx = transaction.account;
double accountAmount = accountTrx.amount;
for (int i =0; i<nbRepeat; i++){
accountAmount +=transactionBiz.amount;
[[Persister instance] registerTransaction:transaction];
}
[[Persister instance]editAmountAccount:transaction.account amount:accountAmount];
[[Persister instance]saveContext];
return YES;
}
//Persister
-(id)init {
if (self = [super init]){
managedObjectContext = [appDelegate managedObjectContext];
return self;
}
return nil;
}
-(BOOL)registerTransaction:(Transaction *)transaction {
TransactionManagedObject *transactionsRow = (TransactionsManagedObject *)[NSEntityDescription insertNewObjectForEntityForName:@"Transactions" inManagedObjectContext:managedObjectContext];
transactionsRow.idTransaction = [NSNumber numberWithInt:transaction.idTransaction];
transactionsRow.name …Run Code Online (Sandbox Code Playgroud) 我是Objective-C的新手,我想要做的是EntityNameConstants.h在我存储所有实体名称的文件中定义变量.
我将使用存储库中的所有定义来处理与ManagedObjectContext相关的所有方法.
例如.这是在.h文件中
define ENTITY_USER_PICTURE = @"UserPicture"
Run Code Online (Sandbox Code Playgroud)
在存储库中我想使用此常量如下
UserPicture *userPicture = (UserPicture *)[NSEntityDescription insertNewObjectForEntityForName:ENTITY_USER_PICTURE
inManagedObjectContext:context];
Run Code Online (Sandbox Code Playgroud)
但我不能这样做,它给了我Parse Issue错误.
我在这里做错了吗?
我正在学习开发iOS应用程序的教程.我正在使用核心数据.该应用程序的第一个视图是RootViewController.所有Core Data堆栈都在AppDelegate文件中.这是代码的一部分AppDelegate.m,它调用RootViewController文件:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Fetch the data to see if we ought to pre-populate
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[self loadFavoriteThingsData];
RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
[rootViewController setManagedObjectContext:[self managedObjectContext]];
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
现在,在应用程序的另一部分,我需要打开一个新的视图控制器,它是一个副本RootViewController,被称为DoneViewController,但使用其他NSPredicates来显示其他核心数据对象.
在RootViewController那里有一个打开MenuViewController文件的按钮,从那里我尝试DoneViewController使用以下方法打开:
- (IBAction)doneToDoaction:(id)sender …Run Code Online (Sandbox Code Playgroud) 我目前如何使用核心数据:
我的应用程序加载:在此页面上,我创建一个托管对象上下文,获取托管对象,并加载/显示它们.这是一个tableview,所以我允许删除.为了删除我创建一个托管对象上下文并删除托管对象并重新加载tableview.在我的应用程序中使用了相同的方法,还有其他操作,例如更新等. 重点是每个动作我创建一个新的托管对象上下文.
我目前对核心数据的理解是,托管对象上下文有点像队列,它充满了行为.其中,托管对象是正在修改的项目,并放入队列以执行操作.使用这个逻辑,整个应用程序中不应该只有一个队列吗?
主要问题:
我是否需要在每个操作之前创建托管对象上下文?或者我可以创建一个托管对象上下文说在应用程序委托确实完成启动?并在整个应用程序中使用它?
编辑:
对于未来的观众(如果我理解提供的答案),我的代码现在通常如下所示:
ManagedObjectContext.在我需要更改我的核心数据对象的整个应用程序中,我执行以下操作:
if let managedContext = ShareData.sharedInstance.managedObjectContext {
// DO STUFF, update, delete, create ect ect ect
}
编辑2:我可能误解了"不要在App代理中创建MOC",目前正在研究这个并尝试学习创建MOC的最佳位置.在其他地方创建一个似乎很乏味,如果每个视图都可以启动应用程序,则需要MOC.