NSmanaged контекстные потоки

Я использую синглтон для работы с массивами и т. Д. Пересекаюсь с представлениями в приложении.

Инициализировать синглтон и 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();
  }
}

Мой метод подсчета - это способ определить, что новый объект не включен, пока я не перезапущу приложение. Метод подсчета также есть в синглтоне.

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

При звонке на синглтон я использую:

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

managedObjectContext имущество:

.час:

@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 ответ

Как я понял из вашего вопроса, вы используете таблицу или подобное.

Если вы хотите обновить таблицу, как только вы сохраните контекст, вам нужно:

  1. Перезагрузите таблицу данных [table reloadData];
  2. или реализуйте в правильных методах делегата (посмотрите, Как Использовать 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]; делает сохранение, как указано выше.

Если вы следуете второму подходу, перезагрузка данных будет обработана для вас.

Надеюсь, это поможет.

редактировать

Делегат вашего выбранного контроллера результатов должен быть контроллером представления (тот, который содержит таблицу). Не помещайте это в свой синглтон!

Другие вопросы по тегам