NSManagedObject提供访问它NSManagedObjectContext,但它保留它吗?
根据Marcus Zarra的 " 在iOS上传递NSManagedObjectContext"," 内部NSManagedObject保留了对它的引用NSManagedObjectContext,我们可以访问它."
Zarra如何知道这一点并且他是否正确?
我问,因为我想知道是否NSManagedObjectContext会dealloc在tearDown下面的方法中编辑.(我正在使用CocoaPlant.)
#import <SenTestingKit/SenTestingKit.h>
#import <CocoaPlant/CocoaPlant.h>
#import "AccountUser.h"
@interface AccountUserTests : SenTestCase {
AccountUser *accountUser;
}
@end
@implementation AccountUserTests
- (void)setUp {
accountUser = [AccountUser insertIntoManagedObjectContext:
[NSManagedObjectContext contextWithStoreType:NSInMemoryStoreType error:NULL]];
}
- (void)tearDown {
[accountUser delete];
}
- (void)testFetchWithLinkedAccountUserID {
// Tests go here...
}
@end
Run Code Online (Sandbox Code Playgroud) 在Jeff Lamarche的精彩教程之后,我正在尝试聚合特定子类的数据NSManagedObject.
这就是场景.我创建了一个名为Product扩展NSManagedObject类的类.Productclass有三个属性,如下所示:
@property (nonatomic, retain) NSString* name;
@property (nonatomic, retain) NSNumber* quantity;
@property (nonatomic, retain) NSNumber* price;
Run Code Online (Sandbox Code Playgroud)
我还创建了一个名为的类别,Product+Aggregate我执行总和聚合.特别是,按照Jeff教程,我管理了数量属性的总和.
+(NSNumber *)aggregateOperation:(NSString *)function onAttribute:(NSString *)attributeName withPredicate:(NSPredicate *)predicate inManagedObjectContext:(NSManagedObjectContext *)context
{
NSString* className = NSStringFromClass([self class]);
NSExpression *ex = [NSExpression expressionForFunction:function
arguments:[NSArray arrayWithObject:[NSExpression expressionForKeyPath:attributeName]]];
NSExpressionDescription *ed = [[NSExpressionDescription alloc] init];
[ed setName:@"result"];
[ed setExpression:ex];
[ed setExpressionResultType:NSInteger64AttributeType];
NSArray *properties = [NSArray arrayWithObject:ed];
[ed release];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request …Run Code Online (Sandbox Code Playgroud) core-data nsfetchrequest nsmanagedobject nsmanagedobjectcontext ios
在Olivier Drobnik的这篇优秀文章之后,我实现了CoreData大师Marcus S. Zarra提出的三层CoreData堆栈:

与此图和我的代码的唯一区别是我只使用一个临时背景MOC,以避免在几个临时MOC中插入对象时出现重复.这是我的上下文初始化代码:
#pragma mark - NSManagedObjectContexts
+ (NSManagedObjectContext *)privateManagedObjectContext
{
if (!_privateManagedObjectContext) {
// Setup MOC attached to PSC
_privateManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_privateManagedObjectContext setPersistentStoreCoordinator:[self persistentStoreCoordinator]];
// Add notification to perform save when the child is updated
_privateContextSaveObserver =
[[NSNotificationCenter defaultCenter]
addObserverForName:NSManagedObjectContextDidSaveNotification
object:nil
queue:nil
usingBlock:^(NSNotification *note) {
NSManagedObjectContext *savedContext = [note object];
if (savedContext.parentContext == _privateManagedObjectContext) {
[_privateManagedObjectContext performBlock:^{
NSLog(@"AMBCoreData -> saving privateMOC");
NSError *error;
if (![_privateManagedObjectContext save:&error]) {
NSLog(@"AMBCoreData -> error …Run Code Online (Sandbox Code Playgroud) multithreading core-data objective-c nsmanagedobjectcontext ios
我正在尝试做的事情:首次将NSFetchedResultsController用于将UITableView连接到Core Data.我是一个新手,真的没有经验,我跟随Ray Wenderlich的教程一字不差.
错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Medicine''`.
Run Code Online (Sandbox Code Playgroud)
我尝试了什么:我发现的其他StackOverflow问题(包括 这个和这个)都没有解释,除了第二个有意义的问题.但是,他提到的方法已经写在我的app委托中,我在我正在使用的TableViewController类中导入.
我非常感激:解释我正在做什么/出了什么问题以及如何解决它,而不仅仅是答案/纠正.
#import "PMMedicinesTableViewController.h"
#import "PMAppDelegate.h"
#import "Medicine.h"
@interface PMMedicinesTableViewController ()
@property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@end
@implementation PMMedicinesTableViewController
@synthesize fetchedResultsController = _fetchedResultsController;
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
// Custom initialization
} …Run Code Online (Sandbox Code Playgroud) core-data objective-c uitableview nsfetchedresultscontroller nsmanagedobjectcontext
[managedObjectContext refreshAllObjects]
Run Code Online (Sandbox Code Playgroud)
实际上,我在保存上下文期间的某个时候遇到随机错误,当我[managedObjectContext refreshAllObjects]在错误后调用时,它允许我保存。
任何人都可以请指导我这种方法。
我在核心数据中有一个实体,我尝试从两个不同的上下文更新它。我正在存储我需要更新的托管对象的 managedObjectID,因为它是线程安全的。在更新我的对象之前,我刷新对象以避免合并冲突。这是我的代码:
context1.performBlock {
let myObject = context1.objectWithID(managedObjectId)
context1.refreshObject(myObject, mergeChanges: true)
myObject.property1 = newValue
}
Run Code Online (Sandbox Code Playgroud)
请注意,我没有在此处保存上下文,因为我想将这些更改作为其他更新事务的一部分提交。
对于同一个对象,我还有一些其他属性需要立即提交,因此我为此创建了单独的上下文以防止 property1 立即提交。
context2.performBlock {
let myObject = context2.objectWithID(managedObjectId)
context2.refreshObject(myObject, mergeChanges: true)
myObject.property2 = newValue
do {
try context2.save()
}
catch {}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中context2,我已经更新了property2,它将立即提交给 db,但在我的情况下这不是那么频繁的更新。在context1我更新property1的频率(以every1秒),我提交它每10秒(请注意,我每次更新property1,我刷新对象,所以我会得到更新的价值property2一旦被改变context2)。
这在大多数情况下都可以正常工作,但有时我会遇到合并冲突。我不知道为什么每次刷新对象后我都会遇到合并冲突。
此外,我的控制台向我显示了相同的对象,除了托管对象的版本,所以如果所有属性都与版本更新的方式相同?
控制台日志:
错误域=NSCocoaErrorDomain 代码=133020 “无法合并更改。” UserInfo={conflictList=( "NSMergeConflict (0x17fa78f0) for NSManagedObject (0x18751830) with objectID '0x170f1ca0' with oldVersion = 8 and newVersion = 9 and old …
core-data nsmanagedobject nsmanagedobjectcontext ios merge-conflict-resolution
我是 coreData 的新手,我有一个问题:
我的应用程序执行以下 3 个连续的核心数据函数:
let managedContext = persistentContainer.viewContext
deleteAllCDRecords(managedContext: managedContext, in: "CDShoppingItem")
saveManagedContext(managedContext: managedContext)
Run Code Online (Sandbox Code Playgroud)
它们定义(缩写)为:
private func deleteAllCDRecords(managedContext: NSManagedObjectContext, in entity: String) {
let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
do {
try managedContext.execute(deleteRequest)
} catch let error as NSError {
// error handling
}
} // deleteAllCDRecords
Run Code Online (Sandbox Code Playgroud)
和
private func saveManagedContext(managedContext: NSManagedObjectContext) {
if !managedContext.hasChanges { return }
do {
try managedContext.save()
} catch let error as NSError {
// error handling
}
} …Run Code Online (Sandbox Code Playgroud) 我是iPhone的第一次Core Data用户/学习者,我认为这[managedObjectContext save:$error]用于保存对Persistant Store的更改.
但是当我重新加载并调用NSFetch时,对象仍然存在.有什么想法吗?
for (int i ; i < [mutableFetchResults count];i++)
{
NSManagedObject *toDelete = [mutableFetchResults objectAtIndex:i];
[managedObjectContext toDelete];
// Update the array and table view.
[mutableFetchResults removeObjectAtIndex:i];
}
if (![managedObjectContext save:&error]) {
// Handle the error.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
Run Code Online (Sandbox Code Playgroud) 我的ipad应用程序出了问题.
我有一个可以通过两种方式访问的视图,如果我以一种方式进行完美的工作.如果我通过另一个进入,它会在保存上下文时崩溃.
我怀疑它是父母的东西(客户的订单) - 我得到一个带有消息的僵尸:
[OrdersByCustomer controllerWillChangeContent:]:当我通过Zombies intstruments运行它时,发送到解除分配的实例0x10102020的消息:
# Category Event Type RefCt Timestamp Address Size Responsible Library Responsible Caller
0 OrdersByCustomer Malloc 1 00:35.545.273 0x89cafc0 272 Dentanet -[CustomersRootController tableView:didSelectRowAtIndexPath:]
1 OrdersByCustomer Retain 2 00:35.545.357 0x89cafc0 0 Dentanet -[CustomersRootController tableView:didSelectRowAtIndexPath:]
2 OrdersByCustomer Retain 3 00:35.545.414 0x89cafc0 0 UIKit -[UISplitViewController setViewControllers:]
3 OrdersByCustomer Release 2 00:35.545.434 0x89cafc0 0 UIKit -[UISplitViewController setViewControllers:]
4 OrdersByCustomer Retain 3 00:35.546.380 0x89cafc0 0 UIKit -[UINib instantiateWithOwner:options:]
5 OrdersByCustomer Retain 4 00:35.546.406 0x89cafc0 0 UIKit -[UINib instantiateWithOwner:options:] …Run Code Online (Sandbox Code Playgroud) memory-management nsfetchedresultscontroller ipad nsmanagedobjectcontext xcode4
尝试在Swift中使用Core Data.找到这个例子:
http://www.sep.com/sep-blog/2014/06/23/ac-developer-learns-swift-part-1-core-data/
创建了具有两个字符串字段的实体" Person " - lastname和firstname.创建UITableViewController(MainTableViewController)以在屏幕上显示记录.创建UIViewController(DetailViewController)以添加新记录.为实体数据创建了我自己的类(AddrBook).
不起作用显示主类中实体中包含的记录 - MainTableViewController.
我的类AddrBook.swift:
import UIKit
import CoreData
@objc(AddrBook)
class AddrBook: NSManagedObject {
@NSManaged var lastname:String
@NSManaged var firstname:String
}
Run Code Online (Sandbox Code Playgroud)
UIViewController添加新记录.DetailViewController.swift:
import UIKit
import CoreData
class DetailViewController: UIViewController {
@IBOutlet var lastNameField : UITextField = nil
@IBOutlet var firstNameField : UITextField = nil
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
init(coder aDecoder: NSCoder!) {
super.init(coder: aDecoder) …Run Code Online (Sandbox Code Playgroud)