NSmanaged上下文线程



我使用singleton来处理应用程序中跨视图的数组等。

为了初始化singleton和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;
}

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

- (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();
  }
}

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

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

当调用singleton时,我使用:

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;

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

我是不是在不同的上下文中使用不同的线程,或者使用不同的fetchedResultsController或不同的singleton(不应该是可能的,对吧?)??


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

在单例标头中:

@interface DataControllerSingleton : NSObject <NSFetchedResultsControllerDelegate>

在实现文件中,

(NSFetchedResultsController *)fetchedResultsController {
    _fetchedResultsController.delegate = self;

正如我从您的问题中了解到的,您使用的是一个表或类似的表。

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

  1. 重新加载数据表[table reloadData];
  2. 或在的正确委托方法中实现(请参阅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];

请注意,您正在调用SAVE两次执行一次。在这种情况下,我假设[self saveContext];如上所述进行保存。

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

希望能有所帮助。

编辑

提取的结果控制器的委托应该是视图控制器(包含表的控制器)。不要把它放在你的单身汉身上!!

最新更新