我看到我的应用程序有几个具有相同核心数据堆栈跟踪的崩溃报告:
我无法重现此崩溃,但我认为这与级联删除关系有关NSManagedObject。_propagatePendingDeletesAtEndOfEvent:这是通过堆栈跟踪中看到的调用来判断的。我NSManagedObjectContext的设置如下:
- (NSManagedObjectContext*)managedObjectContext {
if (_managedObjectContext == nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
}
return _managedObjectContext;
}
Run Code Online (Sandbox Code Playgroud)
关于什么可能导致-save:整个应用程序中的堆栈跟踪调用崩溃的任何想法?
我NSManagedObjectContext在我的 iOS 应用程序中使用 child 作为便签本。我正在使用 的扩展NSManagedObjectContext来创建子上下文,如下所示:
extension NSManagedObjectContext {
func childContext(concurrencyType: NSManagedObjectContextConcurrencyType = .mainQueueConcurrencyType) -> NSManagedObjectContext {
let childContext = NSManagedObjectContext(concurrencyType: concurrencyType)
childContext.parent = self
return childContext
}
}
Run Code Online (Sandbox Code Playgroud)
NSManagedObject当将新的内容插入新的子上下文(从viewContexta创建NSPersistentContainer)时,我的应用程序的一部分重复出现错误,并显示以下消息:
CoreData:错误:从上下文中删除托管对象后对其进行更改
这很奇怪,因为应用程序的其他部分(也使用子上下文)运行良好。NSManagedObject最终,我将原因缩小到将新的(实体名称“Book”)插入新的子上下文的方式上的一个小差异。以下内容按预期工作:
let childContext = container.viewContext.childContext()
let object1 = NSEntityDescription.insertNewObject(forEntityName: "Book", into: childContext)
print(object1.managedObjectContext == nil)
// prints "false"
Run Code Online (Sandbox Code Playgroud)
但是,如果我内联创建子上下文(即未分配给变量,则托管对象不会插入到上下文中):
let object2 = NSEntityDescription.insertNewObject(forEntityName: "Book", into: container.viewContext.childContext())
print(object2.managedObjectContext == nil)
// prints "true"
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很奇怪并且无法弄清楚。一切都在主线程上运行。我还创建了一个Swift …
我正在阅读删除/重置 Core Data 中的所有条目?.
如果我按照以下步骤操作,会得到意想不到的结果:
clearCoreDataStore再次调用(或重新启动),则不会从核心数据中检索该值我错过了什么?
func clearCoreDataStore() {
let entities = dataManager.persistentContainer.managedObjectModel.entities
for entity in entities {
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity.name!)
let deleteReqest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try context.execute(deleteReqest)
} catch {
print(error)
}
}
dataManager.saveContext()
}
Run Code Online (Sandbox Code Playgroud) core-data nsmanagedobject nsmanagedobjectcontext ios nsbatchdeleterequest
我尝试在 Swift 中向我的应用程序添加实时活动。但是,当我尝试运行该应用程序时,出现错误消息“尾随闭包传递给不接受闭包的‘NSManagedObjectContext’类型的参数”。我的应用程序使用 Core Data 来保存我的应用程序的数据。
class HabitManager: ObservableObject {
private var activity: Activity<HabitsWidgetAttributes>? = nil
func startHabit(name: String, symbol: String, currentTask: String) {
let attributes = HabitsWidgetAttributes(name: name, symbol: symbol)
let state = HabitsWidgetAttributes.ContentState(currentTask: currentTask)
activity = try? Activity<HabitsWidgetAttributes>.request(attributes: attributes, contentState: state)
}
func updateActivity(nextTask: String) {
let state = HabitsWidgetAttributes.ContentState(currentTask: nextTask)
Task { // Line where the error is generated
await activity?.update(using: state)
}
}
func stopActivity() {
let state = HabitsWidgetAttributes.ContentState(currentTask: "Finished")
Task { // Line where …Run Code Online (Sandbox Code Playgroud) 这可能是一个非常直接的应用程序,但我是Objective-C(来自Java)的新手,整个内存管理和"EXC_BAD_ACCESS"错误让我心碎.
我有一个普通的NavigationController iPhone App,带有Core Data.在AppDelegate中创建NSManagedObjectContext并将其传递给RootViewController.从主线程直接查找视图以填充表,这似乎工作正常.
该应用程序是某种RSS类型的阅读器,因此只要应用程序启动,我就会触发一个线程来获取新数据并更新视图:
-(void)updateData:(id)sender {
UIActivityIndicatorView *activityIndicator =
[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
[activityIndicator startAnimating];
UIBarButtonItem *activityItem =
[[UIBarButtonItem alloc] initWithCustomView:activityIndicator];
[activityIndicator release];
self.navigationItem.leftBarButtonItem = activityItem;
[activityItem release];
// Start thread to update the data
[NSThread detachNewThreadSelector:@selector(doUpdateData) toTarget:self withObject:nil];
}
-(void)doUpdateData{
NSLog(@"Update data Thread (in 5 sec.)");
[NSThread sleepForTimeInterval:5];
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
DataManager *data = [[DataManager alloc] initWithContext:managedObjectContext];
[data updateData];
[data release];
data=nil;
[self performSelectorOnMainThread:@selector(finishUpdateData) withObject:nil waitUntilDone:NO];
[pool release];
}
-(void)finishUpdateData{
self.navigationItem.leftBarButtonItem = …Run Code Online (Sandbox Code Playgroud) 我Model.xcdatamodeld用一个实体创建了一个iOS项目和一个托管对象模型().在application:didFinishLaunchingWithOptions:我想测试托管对象模型是否存在,但是我得到了nil.在创建托管对象模型后,是否必须执行一些特殊操作才能创建托管对象上下文?
关于我可能做错的任何建议?
这是界面
@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
}
@property (nonatomic, strong, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, strong, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@end
Run Code Online (Sandbox Code Playgroud)
这是实现文件
#import "AppDelegate.h"
#import "RootViewController.h"
@implementation AppDelegate
@synthesize window = _window;
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
@synthesize navigationController = _navigationController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if (![self managedObjectContext])
{
NSLog(@"Does not exist");
}
return YES;
}
Run Code Online (Sandbox Code Playgroud) 我似乎得到了一个我无法理解的错误.希望这不会太混乱和冗长,但由于我似乎无法在我的搜索中找到任何答案,我认为这可能是必要的.在我的程序中,我有几个实体:
ItemSold发票客户
Customer可以有很多Invoices,Invoices可以有很多ItemSolds.
在我的Interface Builder中,我有三个表.一个表代表客户,另一个代表发票,最后一个代表发票中的项目.因此,当您选择客户时,他们的发票会显示在发票表中.单击发票后,该发票上的项目将显示在最后一个表格中.
当我在桌子上选择时,我似乎得到了错误.有趣的是,在另一种观点中,我可以做得很好(当我尝试根据他们与Type的关系对Items进行排序时).但是我无法在这里工作.这是我获取应该存储的项目:
if (managedObjectContext == nil)
{
managedObjectContext = [(HistoryController *)[[NSApplication sharedApplication] delegate] managedObjectContext];
}
NSError *error = nil;
// fetch all customers
NSFetchRequest *fetchRequest2 = [[NSFetchRequest alloc] init];
NSEntityDescription *entity2 = [NSEntityDescription entityForName:@"Customer"
inManagedObjectContext:managedObjectContext];
[fetchRequest2 setEntity:entity2];
fetchedCustomers = [managedObjectContext executeFetchRequest:fetchRequest2 error:&error];
if (fetchedCustomers == nil) {
NSLog(@"ERROR");
}
[fetchRequest2 release];
// end of customer fetch
// fetch all invoices
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = …Run Code Online (Sandbox Code Playgroud) core-data objective-c nstableview nspredicate nsmanagedobjectcontext
概观
题
接下来的步骤
输出注意到了
setBeforeSave.count = 1
setAfterSave.count = 0
Run Code Online (Sandbox Code Playgroud)
NSManagedObjectContext方法insertedObjects返回1个对象NSManagedObjectContext方法insertedObjects返回0个对象NSManagedObjectContext方法save:返回YES.插入对象的代码
Test *test = [NSEntityDescription insertNewObjectForEntityForName:@"Test" inManagedObjectContext:self.database.managedObjectContext];
Run Code Online (Sandbox Code Playgroud)
保存代码:
//database is a property of the type UIManagedDocument
NSSet *setBeforeSave = [self.database.managedObjectContext insertedObjects];
NSLog(@"setBeforeSave.count = %i", setBeforeSave.count);
NSError *error = nil;
if(![self.database.managedObjectContext save:&error])
NSLog(@"error = %@", error);
NSSet *setAfterSave = [self.database.managedObjectContext insertedObjects]; …Run Code Online (Sandbox Code Playgroud) 我有一堆NSOperations和他们自己的NSManagedObjectContexts对我的Core Data存储进行了更改并保存并成功地将他们的更改变为主线程的NSManagedObjectContext.我知道这个.现在我希望在主要上下文更新时通知前UIViewController.所以我...
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(refreshData:)
name:NSManagedObjectContextDidSaveNotification
object:[NSManagedObject mainThreadManagedObjectContext]];
}
Run Code Online (Sandbox Code Playgroud)
但是,我不认为在合并后台线程的更改后,主线程的NSManagedObjectContext会发布自己的任何通知.我试图在文档中的哪个地方找到Apple说我应该在告诉主要线程合并更改或其他一些之后发布我自己,但没有运气.为了在我的NSOperation中额外参考,我有......
+ (void)mergeChanges:(NSNotification *)notification
{
NSManagedObjectContext *managedObjectContext = [self mainThreadManagedObjectContext];
[managedObjectContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:YES];
}
+ (NSManagedObjectContext *)adHocManagedObjectContext
{
NSManagedObjectContext *adHocManagedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] adHocManagedObjectContext];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:adHocManagedObjectContext];
return adHocManagedObjectContext;
}
Run Code Online (Sandbox Code Playgroud)
我是否希望听到主线程的NSManagedObjectContext有关它的保存,或者我应该在mergeChangesFromContextDidSaveNotification后发布我自己的通知:?
我正在将Core Data集成到一个不是使用Core Data模板创建的应用程序中.我遇到了这方面的问题,可能有一个非常简单的答案.但是,由于大多数关于这个主题的教程都是针对使用模板的,所以我很难过.
我已经按照建议创建了一个选中Core Data的简单应用程序,并将生成的代码复制到我现有的应用程序中.但是,我无法弄清楚如何访问AppDelegate之外的NSManagedObjectContext.我有几个视图控制器,我需要访问托管对象上下文.
我复制到应用程序中的生成代码放在AppDelegate中,以及.pch文件中对CoreData的引用.我错过了什么吗?如何访问托管对象上下文?
谢谢!V