0

私の質問とここに記載されている解決策について詳しく説明します: https://stackoverflow.com/a/19153387/260665問題を解決する唯一の方法は、ブロックを実装@try-@catchし、スレッドの結果をクリアして例外を適切に処理することでした例外の。

これは私のtry-catchブロックです:

    // These operations are meant to calculate statistics for the Task objects, now when the statistics are being calculated there are possibilities that the main thread might delete the ManagedObject from it's MOC and write to the store. Now this means that ManagedObjects here may not have an equivalent record back in the store to refer!
    // So, when the already faulted objects try to access it's properties, NSObjectInaccessibleException arises. For more details check the SO post: https://stackoverflow.com/questions/18828164/coredata-object-fault-in-independent-managedobjectcontext-vs-changes-in-persiste
    // Hence catching the exception and returning back no results is the best approach as of now!
    @try
    {
        CSStatistics *theStats = [self statisticsOperationFromDate:self.dateRange.fromDate
                                                            toDate:self.dateRange.toDate];
        [self setOutStatistics:theStats];

        if ([(NSObject*)[self resultDelegate] respondsToSelector:@selector(statisticsOperationCompletedWithOperation:)])
        {
            [(NSObject*)[self resultDelegate] performSelectorOnMainThread:@selector(statisticsOperationCompletedWithOperation:)
                                                               withObject:self
                                                            waitUntilDone:NO];
        }
    }
    @catch (NSException *exception)
    {
        DEBUGLog(@"Most probably a NSObjectInaccessibleException exception! - %@", exception);
        [self setOutStatistics:nil];    // We would not like to give out erroneous reports! Mind it!
    }
    @finally
    {

    }

奇妙なことが起こります。私の try-catch ブロックは、ディストリビューション ビルドでは完全に機能しますが、デバッグ ビルドとリリース ビルドではアプリがクラッシュします。どうやら、発生した例外はどこかで処理され、@catchブロックには渡されず、代わりに消費されます。Xcodeが同じ詳細を提供しないため、どこにあるのかわかりません。

これは、デバッグ モードでのログです。

2013-10-23 14:33:07.293 CATSXT[64267:650b] *** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0x1912fc00 <x-coredata://6E14A109-8A14-4369-BBC5-468D790A8D9E/CSTask/p7562>''
*** First throw call stack:
(0x33af012 0x2d25e7e 0x2a4ba48 0x2a4b3f7 0x2a4b031 0x2a4aea6 0x10eb42e2 0x5e02d 0x242e00b 0x2a86fc4 0x5cc58 0x244c247 0x5d492 0x244c205 0x5d492 0x246d23c 0x2440c70 0x15c075 0x15caac 0x15c6dd 0x244e453 0x244e164 0x24daa31 0x601253f 0x6024014 0x60152e8 0x6015450 0x949b0e72 0x94998d2a)
libc++abi.dylib: terminate called throwing an exception

いくつかのグーグルは、「すべての例外」ブレークポイントがそのような動作をもたらすことを示しましたが、そのブレークポイントも無効にしました。ブロックがデバッグ ビルドとリリース ビルドで実行されない理由はまだわかり@catchませんが、ディストリビューション ビルドでは完全に機能します。これは本番アプリのユーザーには問題ありませんが、開発プロセスには確実に悪影響を及ぼします。

どんなリードでも大歓迎です。

4

0 に答える 0