私はここでかなり欠けていることを知っていますが、コードを含むチュートリアルが見つからず、それが私を狂わせています。
プルトゥリフレッシュを介して更新できる(コアデータからプルされた)テーブルビューにアイテムを表示するアプリがあります。アップデータは、REST APIから新しいデータを取得してコアデータに保存し、TableViewControllerに含まれるデータのマスターセットを更新します。
明らかに、pull-to-refreshを非ブロッキングにしたいので、MOC:performBlockメソッド呼び出し内に実装しました。すべてが機能しているように見えますが、モデル内でデータベース操作を実行すると、アプリケーションがランダムにクラッシュします。これは、MOCと永続オブジェクトモデルを誤って管理しているためです。誰かが私を正しい方向に向けることができれば、私は感謝するでしょう。
データとテーブルの更新を実際に実行するメソッドは次のとおりです。以下に、役立つ可能性のある一連の補助コードを示します。
-(void)refresh {
NSManagedObjectContext *child = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[child setParentContext:self.db];
[child performBlock:^{
model = [[CustomersModel alloc] init];
self.custs = [model getUpdatedCustomers:self.db];
self.workingSet = self.custs;
dispatch_async(dispatch_get_main_queue(), ^{
[super performSelector:@selector(stopLoading) withObject:nil afterDelay:1.0];
});
}];
}
-(void)stopLoadingComplete {
...
[self.tableView reloadData];
}
MOC、永続データストアなどを設定するための私のappdelegateコードは次のとおりです。
- (NSManagedObjectContext *)managedObjectContext
{
if (__managedObjectContext != nil)
{
return __managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil)
{
__managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[__managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return __managedObjectContext;
}
MOCをUITableViewControllersに割り当てるためのアプリデリゲートコードは次のとおりです。
CustomerListViewController *clvc = [[CustomerListViewController alloc] initWithNibName:@"CustomerListViewController" bundle:nil withManagedContext:self.managedObjectContext];
clvc.detailViewController = detailViewController;
UINavigationController *clvcNav = [[UINavigationController alloc] initWithRootViewController:clvc];
MOCを割り当てるための顧客リストビューコントローラーのコードは次のとおりです。
customerlistview.h:
#import <UIKit/UIKit.h>
#import "CustomersModel.h"
#import "SearchBarTableViewController.h"
@interface CustomerListViewController : SearchBarTableViewController
{
CustomersModel *model;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil withManagedContext:(NSManagedObjectContext *)db;
@property (retain) IBOutlet UISearchBar *searchBar;
@property (strong, nonatomic)NSManagedObjectContext *db;
@property (strong, nonatomic)NSArray *custs, *workingSet;
@end
customerlistview.m:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil withManagedContext:(NSManagedObjectContext *)passedDB {
self.db = passedDB;
return [self initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
}