0

複数のスレッドとゲッターのみを使用する場合、プロパティをアトミックにする必要がありますか?

特定のViewControllerに対してセグエを実行する前に、インスタンス変数を設定します。

そのプロパティは、複数のスレッドからアクセスされます (ゲッターのみ)。これが私が使用しているコードです。私のtableView CellForRowAtIndexPathメソッドから実行されています。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    Day *aDay = [[[self days]  objectAtIndex:indexPath.section] objectAtIndex: indexPath.row];

    NSDictionary * data = [OperationsManager workTimeAndAmountForDay: aDay];

    NSString *workTime  = [data objectForKey:@"Work Time"];
    NSString *amount    = [data objectForKey:@"Amount"];

    NSString *textLabel = [NSString stringWithFormat:@"%d - H: %@ $: %@", [[aDay day_] integerValue], workTime, amount];

    dispatch_async(dispatch_get_main_queue(), ^{

        [[cell textLabel] setFont: [UIFont systemFontOfSize: 24.0]];
        [[cell textLabel] setText: textLabel];

        [cell setNeedsLayout];

    });

});

これらを1つのスレッドでのみ行う場合。GCD なし。エラーはありません。しかし、GCDを使用しているときにこれを行うと、通常は次のようになります。

2012-08-30 13:05:52.027 Work Clock[17236:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'statement is still active'
*** First throw call stack:
(0x36a1188f 0x32e28259 0x352c93dd 0x352c8c87 0x3536c951 0x352d8b1f 0x352d0f73 0x35376dd5 0x352e2d1b 0x352e2247 0x352e1d5b 0x352e1c0b 0xc921f 0xc6fed 0x34c7f5cf 0x34c7f55f 0x34c4d495 0x34c42225 0x34c41763 0x34be5f37 0x369701fb 0x32083aa5 0x320836bd 0x32087843 0x3208757f 0x3207f4b9 0x369e5b1b 0x369e3d57 0x369e40b1 0x369674a5 0x3696736d 0x34b2e439 0x34c10cd5 0xbff55 0xbfef0)
terminate called throwing an exception2012-08-30 13:05:52.032 Work Clock[17236:1b03] *** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0x2be320 <x-coredata://E4D2B2E1-B3D9-4358-810B-0FDE7A679A16/Day/p1>''
*** First throw call stack:
(0x36a1188f 0x32e28259 0x352e24f3 0x352e1d5b 0x352e1c0b 0xc95c9 0xc7395 0x37438c59 0x374447bb 0x32f59dfb 0x32f59cd0)
terminate called throwing an exception(lldb) 

私もこの方法で、

 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

同じプロパティのいくつかを呼び出します。そこでエラーが発生することもありますが、アセンブリコードしか取得できません。現時点では、エラーを再現できません。

ひとつメモ、

私の呼びかけは、

[OperationsManager workTimeAndAmountForDay: aDay];

私の OperationsManager クラスで定義されたClass methodです。クラス プロパティはまったくありません

+(NSDictionary *)workTimeAndAmountForDay:(Day *)aDay;

したがって、VC複数のスレッドを使用するときにゲッターのみを使用していて、 Class メソッドにクラス プロパティがない場合。

これらのエラーが発生し続けるのはなぜですか? また、複製するのは本当に難しいです!そこには「偶然性」が感じられます。

どんな助けでも大歓迎です!

GCDの使用をやめることができました。そして、エラーはなくなります。しかし、スクロール時のユーザー エクスペリエンスは大幅に低下します。

前もって感謝します。

ヌーノ

また、これらは私がアクセスしている Core Data オブジェクトです。それが役立つかどうかわかりませんか?また、コンテキストは 1 つだけです。しかし、もう一度。私はオブジェクトを読んでいるだけです。オブジェクトの状態を保存または変更しない。

4

1 に答える 1

1

についてatomicは、次の bbum の投稿を参照してください。

http://www.friday.com/bbum/2008/01/13/objectivce-c-atomic-properties-threading-andor-custom-settergetter/

クラッシュを見ると、それはCoreData関連しています。見る ...

*** Terminating app due to uncaught exception
'NSObjectInaccessibleException', reason: 'CoreData
could not fulfill a fault for '0x2be320
<x-coredata://E4D2B2E1-B3D9-4358-810B-0FDE7A679A16/Day/p1>''

CoreData...複数のスレッドからオブジェクト、コンテキストなどにどのようにアクセスしますか? この記事を読みましたか:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/coredata/Articles/cdConcurrency.html%23//apple_ref/doc/uid/TP40003385-SW1

于 2012-08-30T12:38:41.473 に答える