gpt4 book ai didi

ios - NS 管理上下文线程

转载 作者:行者123 更新时间:2023-11-29 13:10:50 25 4
gpt4 key购买 nike

我使用单例来处理数组等。在应用程序中交叉 View 。

为了初始化单例和 NSManagedObjectContext,以便我可以获取对象,我使用:

+(DataControllerSingleton *)singleDataController
{
static DataControllerSingleton * single=nil;

@synchronized(self)
{
if(!single)
{
single = [[DataControllerSingleton alloc] init];
NSManagedObjectContext *context = [single.fetchedResultsController managedObjectContext];

single.masterCareList = [[NSMutableArray alloc] init];
}
}
return single;
}

当我插入一个新对象时,该对象将不会显示在显示函数中,直到我重新启动应用程序。我通过这个方法在单例类中插入新对象:

- (void)insertNewObject:(Care *)care
{
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];

NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];

NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:
[entity name] inManagedObjectContext:self.managedObjectContext];

NSString *fileName = care.pictureURL;
NSString *text = care.causeText;
NSDate *date = care.date;
NSData *imgData = care.imageData;

[newManagedObject setValue:fileName forKey:@"urlPath"];
[newManagedObject setValue:text forKey:@"name"];
[newManagedObject setValue:date forKey:@"date"];
[newManagedObject setValue:imgData forKey:@"imageData"];

// Save the context.
[self saveContext];

NSError *error = nil;
if (![context save:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should
not use this function in a shipping application, although it may be useful during
development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}

我的计数方法是在我重新启动应用程序之前判断新对象未被包含在内的方法。计数方法也在单例中。

- (NSUInteger)countOfList
{
NSArray *fetchedData = [_fetchedResultsController fetchedObjects];
return [fetchedData count];
}

调用单例时我使用:

DataControllerSingleton *singletonData = [DataControllerSingleton singleDataController];    
[singletonData insertNewObject:care];

managedObjectContext 属性:

.h:

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;

.m:

@implementation DataControllerSingleton

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

为什么在我重新启动应用程序之前,我的新对象不会显示在 ex count 中?

我是否以某种方式使用具有不同上下文的不同线程,或者不同的 fethedResultsController 或不同的单例(应该不可能吧?)?


我添加了这两行,它们不包含在生成的 CoreData 堆栈中,现在可以正常工作了。

在单例标题中:

@interface DataControllerSingleton : NSObject <NSFetchedResultsControllerDelegate>

在实现文件中,

(NSFetchedResultsController *)fetchedResultsController {

_fetchedResultsController.delegate = self;

最佳答案

根据您的问题,我了解到您使用的是表格或类似的东西。

如果您想在保存上下文后立即更新表格,您需要:

  1. 重新加载数据表[table reloadData];
  2. 或在正确的委托(delegate)方法中实现(查看 How To Use NSFetchedResultsController)

如果您遵循第一个选项,您可以只在上下文中保存并在表上调用 realod 数据。

NSError *error = nil;
if (![context save:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should
//not use this function in a shipping application, although it may be useful during
development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}

[table reloadData];

请注意,您调用了两次保存 执行一次。在这种情况下,我假设 [self saveContext]; 会像上面那样进行保存。

如果您采用第二种方法,将为您处理数据重新加载。

希望对您有所帮助。

编辑

您的获取结果 Controller 的委托(delegate)应该是一个 View Controller (包含表格的那个)。不要把它放在你的单例中!!

关于ios - NS 管理上下文线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17429203/

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