NSmanaged上下文线程

时间:2013-07-02 15:09:23

标签: ios core-data singleton nsmanagedobjectcontext

我使用单例来处理数组等交叉应用程序中的视图。

要初始化单例和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方法也在单例中。

- (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 个答案:

答案 0 :(得分:1)

据我所知,你正在使用一张桌子或类似的东西。

如果您想在保存上下文后立即更新表格,请执行以下操作:

  1. 重新加载数据表[table reloadData];
  2. 或实现正确的委托方法(看看How To Use NSFetchedResultsController
  3. 如果您按照第一个选项,您可以在上下文中执行保存并在表上调用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];执行上述保存。

    如果您按照第二种方法进行操作,则会为您处理数据重新加载。

    希望有所帮助。

    修改

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