私のプログラムは、Coredata(SQLite)、NSPersistentDocument、NSTableView、および(エンティティ)NSArrayControllerを使用しています。メインスレッドのNSTableViewの列を、セカンダリスレッドに入力したエンティティNSArrayControllerにバインドしたいと思います。
質問1:それは可能ですか?残念ながら、私の場合は機能していません(IBの動作を通じて同じスレッドですべてを実行している間)
目的は次のとおりです。「フェッチ」(大きなドキュメントの平均は2〜4秒で終了します)をセカンダリスレッドで実行して、フェッチ中にUIに進行状況インジケーターを表示できるようにします。
質問2:エンティティnsarraycontrollerがデータの配置、フェッチなどを行っているときに進行状況インジケーターを表示する他の推奨される方法はありますか?
前もって感謝します。ルイス
// ------- ABCoredataController.h
@interface ABCoredataController : NSObject {
:
NSArrayController *ivArrayController;
}
@property (nonatomic, assign) NSArrayController *arrayController;
// ------- ABCoredataController.m
// This piece executes in Main thread...
- (void) init {
ivArrayController = [[NSArrayController alloc] init];
:
// Following is later executed in the Secondary Thread
- (void) secondaryThreadRun:(id)param {
:
// prepare everything to access coredata from a secondary thread...
[self setSecondaryThreadMOC: [[[NSManagedObjectContext alloc]init] autorelease] ];
[[self secondaryThreadMOC] setPersistentStoreCoordinator:[self mainThreadPSC]];
// prepare the (entity) array controller
[[self arrayController] setAvoidsEmptySelection:YES];
[[self arrayController] setPreservesSelection:YES];
[[self arrayController] setSelectsInsertedObjects:YES];
[[self arrayController] setClearsFilterPredicateOnInsertion:YES];
[[self arrayController] setAutomaticallyPreparesContent:YES];
[[self arrayController] setAutomaticallyRearrangesObjects:YES];
[[self arrayController] setAlwaysUsesMultipleValuesMarker:NO];
[[self arrayController] setUsesLazyFetching:NO];
[[self arrayController] setEditable:YES];
[[self arrayController] setEntityName:@"Transaction"];
// bind arrayController to the managedObjectContext
[[self arrayController] setManagedObjectContext:[self secondaryThreadMOC]];
[[self arrayController] setFilterPredicate:[self predicate]];
:
次に、XIBとすべてのUIを制御するクラス内で...
// ------- ABWindowController.m
:
// Start the secondaryThreadRun in previous class
[[self coredataCtrlTransaction] start];
// Get the pointer to the entity array controller !!! <== HERE!! is it right?
ivOut_CtEn_Transaction = [[self coredataCtrlTransaction]arrayController];
:
// Bind that entity array controller to the NSTableView columns...
if ( [self out_CtEn_Transaction] != nil ) {
for ( NSTableColumn *column in [[self out_Tableview_Transaction] tableColumns] ) {
if ( [column identifier] != nil ) {
if ( [column infoForBinding:@"value"] == nil ) {
NSString *theKeyPath=nil;
if ( [[column identifier] length] > 4 )
theKeyPath = [[column identifier] substringFromIndex:4];
else
theKeyPath = [column identifier];
[column bind: @"value" toObject: [self out_CtEn_Transaction]
withKeyPath:[NSString stringWithFormat:@"arrangedObjects.%@", theKeyPath] options:nil];
}
}
}
}