1

配列などを操作するためにシングルトンを使用します。アプリケーションのビューを横断します。

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

私の count メソッドは、アプリケーションを再起動するまで新しいオブジェクトが含まれていないことを伝える方法です。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 カウントに表示されないのはなぜですか?

どういうわけか、異なるコンテキストを持つ異なるスレッド、または異なる fethedResultsController または異なるシングルトンを使用していますか? (可能ではありませんか?)?


生成された CoreData スタックに含まれていないこれらの 2 行を追加したところ、正常に動作するようになりました。

シングルトンヘッダーで:

@interface DataControllerSingleton : NSObject <NSFetchedResultsControllerDelegate>

実装ファイルでは、

(NSFetchedResultsController *)fetchedResultsController {

    _fetchedResultsController.delegate = self;
4

1 に答える 1

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];

SAVEを 2回呼び出していることに注意してください。この場合[self saveContext];、上記のように節約できると思います。

2 番目の方法に従うと、データの再読み込みが自動的に処理されます。

それが役立つことを願っています。

編集

フェッチされた結果コントローラーのデリゲートは、ビュー コントローラー (テーブルを含むコントローラー) である必要があります。シングルトンに入れないでください!!

于 2013-07-03T15:13:07.433 に答える