0

私はここでかなり欠けていることを知っていますが、コードを含むチュートリアルが見つからず、それが私を狂わせています。

プルトゥリフレッシュを介して更新できる(コアデータからプルされた)テーブルビューにアイテムを表示するアプリがあります。アップデータは、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];
}
4

1 に答える 1

0

私は確かにこの質問に答えるつもりです-子コンテキストがそのことをした後に親コンテキストを保存するので、私は1つのプログラムクラッシュを受け取りませんでした。

于 2012-11-03T13:22:40.313 に答える