16

ごくまれに、NSFetchedResultsControllerを使用した画面のクラッシュレポートでこれらのポップアップが表示され、その対処方法が不明です。 NSFetchedResultsが内部でそれらを使用していない限り、私はどこでもスレッドを使用しているとは思いません。iOSクラッシュ 'NSInternalInconsistencyException'、理由: 'ステートメントはまだアクティブです'コアデータキャッシュに関連していますか?

'NSInternalInconsistencyException'、理由: '文はまだ有効です'は私が得る完全な説明です。

最近の二つのスタックトレース:

0 CoreFoundation      0x37a368bf __exceptionPreprocess + 163 
1 libobjc.A.dylib      0x3151c1e5 objc_exception_throw + 33 
2 CoreData       0x340b2ea5 -[NSSQLiteStatement cachedSQLiteStatement] + 1 
3 CoreData       0x340b274f -[NSSQLiteConnection prepareSQLStatement:] + 55 
4 CoreData       0x34156049 -[NSSQLChannel selectRowsWithCachedStatement:] + 61 
5 CoreData       0x34181d63 newFetchedRowsForFetchPlan_MT + 783 
6 CoreData       0x340bab07 -[NSSQLCore newRowsForFetchPlan:] + 351 
7 CoreData       0x34160011 -[NSSQLCore fetchRowForObjectID:] + 1005 
8 CoreData       0x340cca57 -[NSSQLCore newValuesForObjectWithID:withContext:error:] + 195 
9 CoreData       0x340cbf83 _PFFaultHandlerLookupRow + 423 
10 CoreData       0x340cba97 _PF_FulfillDeferredFault + 187 
11 CoreData       0x340cb94f _sharedIMPL_pvfk_core + 39 
12 PowerPro       0x0006a779 -[GuestCard getPrimaryProspectiveTenant] (GuestCard.m:77) 
13 PowerPro       0x00017bf9 -[OutstandingFollowupsViewController configureCell:atIndexPath:] (OutstandingFollowupsViewController.m:208) 
14 PowerPro       0x00017b9b -[OutstandingFollowupsViewController tableView:cellForRowAtIndexPath:] (OutstandingFollowupsViewController.m:203) 

Last Exception Backtrace: 
0 CoreFoundation      0x37a368bf __exceptionPreprocess + 163 
1 libobjc.A.dylib      0x3151c1e5 objc_exception_throw + 33 
2 CoreData       0x340b2ea5 -[NSSQLiteStatement cachedSQLiteStatement] + 1 
3 CoreData       0x340b274f -[NSSQLiteConnection prepareSQLStatement:] + 55 
4 CoreData       0x34156049 -[NSSQLChannel selectRowsWithCachedStatement:] + 61 
5 CoreData       0x340c26eb -[NSSQLCore _newRowsForFetchPlan:selectedBy:withArgument:] + 515 
6 CoreData       0x340bab3f -[NSSQLCore newRowsForFetchPlan:] + 407 
7 CoreData       0x3415ea55 -[NSSQLCore newFetchedPKsForSourceID:andRelationship:] + 2217 
8 CoreData       0x3416a935 -[NSSQLCore newValueForRelationship:forObjectWithID:withContext:error:] + 689 
9 CoreData       0x34108f8b -[NSFaultHandler retainedFulfillAggregateFaultForObject:andRelationship:withContext:] + 479 
10 CoreData       0x340dcb23 -[_NSFaultingMutableSet willRead] + 219 
11 CoreData       0x340dc70b -[_NSFaultingMutableSet count] + 23 
12 PowerPro       0x00016eb1 -[BrowseGuestCardsViewController configureCell:atIndexPath:] (BrowseGuestCardsViewController.m:246) 
13 PowerPro       0x00017173 -[BrowseGuestCardsViewController tableView:cellForRowAtIndexPath:] (BrowseGuestCardsViewController.m:222) 
14 UIKit        0x34e4e9cb -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 547 
15 UIKit        0x34e4daa9 -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1077 
16 UIKit        0x34e4d233 -[UITableView layoutSubviews] + 207 
17 UIKit        0x34df1d4b -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 183 
18 CoreFoundation      0x3799522b -[NSObject performSelector:withObject:] + 43 
19 QuartzCore       0x3318c381 -[CALayer layoutSublayers] + 217 
20 QuartzCore       0x3318bf99 CA::Layer::layout_if_needed(CA::Transaction*) + 217 
21 QuartzCore       0x3318bea5 -[CALayer layoutIfNeeded] + 153 
22 UIKit        0x34eb6fe1 -[UIButton titleLabel] + 73 
23 PowerPro       0x00017983 -[BrowseGuestCardsViewController viewDidLoad] (BrowseGuestCardsViewController.m:75) 
+1

CoreData呼び出しを行う場所に 'assert([NSThread currentThread] == [NSThread mainThread])'を追加するだけで、あなたのメインスレッドからコアデータにアクセスしていることを確認してみてください。 – nielsbot

+0

cf. http://stackoverflow.com/questions/3078177/core-data-fetch-request-fails-with-nsinternalinconsistencyexception-reason – nielsbot

+0

はい、私はその質問を見ました。彼らが私がやっているとは思わない2つのMOCを使用していたので、私の質問に答えてくれないようです。 –

答えて

15

これは、いくつかの方法または別では、スレッドの問題である可能性が高い以上です。質問には確かに十分な情報がありませんが、クラッシュログを調べ、例外時にすべてのスレッドのスタックトレースを調べて、他のスレッドが何かをやっているかどうか確認してみてください管理対象オブジェクトを使用します。バックグラウンドでコアデータオブジェクトを使用して、気付かなかった同時性を使用して、通知ハンドラ、URL接続完了ハンドラ、またはその他のコードを使用している可能性があります。 を設定するか、にアクセスすると、複数のスレッドで使用されているコンテキストからの管理対象オブジェクトのすべてのプロパティが潜在的にこの種の例外をトリガする可能性があり、診断するのが難しくなる可能性があります。

ほとんどのアプリケーションでこれらの問題を解決する比較的簡単な解決策は、そのコードの実行を(dispatch_async()を使用して)メインスレッドにプッシュすることです。別の方法として、たくさんの処理がある場合は、バックグラウンドスレッドで子コンテキストを作成し、その子コンテキストからオブジェクトを再フェッチし、子コンテキストを保存する方が良いかもしれません。スレッドだけにアクセスできるプロパティであるオブジェクトが上にもともとフェッチされたと同時に(からNSFetchedResultControllerでデータを要求しながら、もちろん、あなたがそのobjectIDを持っている必要があり、再フェッチ対象に、...

+0

私は通常、子の1つのプライベートキューで実行しているperformBlock内にメインのUIコンテキストを保存しようとしたときにこれが発生しています... – MiKL

+1

+1 "と他のスレッドがマネージドオブジェクト " –

+0

これは本当ですか? "もちろん、オブジェクトを再フェッチするには、そのオブジェクトIDを持つ必要があります。これは、オブジェクトが最初にフェッチされたスレッドでのみアクセスできるプロパティです..." –

6

はこのエラーを得ましたメインスレッドのコンテキスト)とNSFetchRequestをバックグラウンドコンテキストで使用します。

私がこれを処理した方法は、各MOCに独自の永続的ストアコーディネータを持たせることです。両方の永続ストアコーディネータは、ディスク上の同じ永続ストアと通信します。

関連する問題