5

ここで何が起こっているかというと、アプリが を受信したところですNSPersistentStoreDidImportUbiquitousContentChangesNotification

- (void)storesDidUpdate:(NSNotification*)note {
    FLOG(@"storesDidUpdate ");
    [_managedObjectContext mergeChangesFromContextDidSaveNotification:note];

    // Refresh user Interface
    [[NSNotificationCenter defaultCenter] postNotificationName:@"iProjectCoreDataUpdated"
                                                        object:self];

    [self updateDetails];
}

そして今、アプリは次のことを行うだけで、テキストの新しいコピーで UITextView を更新しようとしています:

self.detailText.attributedText  = [self.detailItem valueForKey:@"scope"];

ここで、detailItem は、iCloud から更新を受け取る前に取得された NSManagedObject です。

textContainer が不平を言っている理由や不平を言っている理由がわかりません。また、完了したという通知を既に受け取っているため、ログのインポートが行われている理由もわかりません。

奇妙なことに、単に reloadData を呼び出すと、他の UITableView が正しく更新されます。

私がここで何か間違っているかどうかについてのアイデアはありますか? textView を更新しようとしないと正常に動作し、ビューを閉じて戻ると正しいデータが得られることに注意してください。

また、アプリを再起動すると、すべてのデータがそこにあり、破損などはありません。実際、iCloud の両側で問題が発生しているにもかかわらず、Core Data ストアに関しては、アプリはほとんどの点で非常に堅牢に見えます!

ああ、reloadFetchedResults は少し誤解を招く可能性があります。それを行う必要がないように思われるためです。そのため、メソッド名は過去の名残りです。私が行っているのは、この呼び出しで UI の値を更新することだけです。

2013-10-09 07:25:53.783 MyApp[4509:510b] OpeningViewController.reloadFetchedResults: 呼び出された 2013-10-09 07:25:53.786 MyApp[4509:510b] InfoDetailViewController.reloadFetchedResults: InfoDetailViewController で呼び出された 2013-10-09 07 :25:53.788 MyApp[4509:510b]* void _UIPerformResizeOfTextViewForTextContainer(NSLayoutManager *, UIView *, NSTextContainer *, NSUInteger)() でのアサーションの失敗、/SourceCache/UIFoundation/UIFoundation-258/UIFoundation/TextSystem/NSLayoutManager_Private.m:1510 2013-10-09 07:25:53.793 MyApp [4509:510b] -_PFUbiquityRecordImportOperation main: CoreData: Ubiquity: Error importing transaction log: transactionLogLocation: : /var/mobile/Library/Mobile Documents/HHHHHHNNNN~com~mycompany~MyApp/CoreData/New Document/duncangroenewald~simAABC628E-9D5E- 58F7-9B8D-0BC724C6D0C8/New Document/W8MckEJ0x2d~HZZIeUH2be6hs41TEOONzKIrCuLcuP4=/6C953E7C-B2AF-47F7-B828-DD062B96415D.1.cdt transactionNumber: 5 、例外: メインスレッドでのみ実行! ユーザー情報: (null) 2013-10-09 07:25:53.803 MyApp[4509:510b] -_PFUbiquityRecordsImporter 操作:failedWithError:: CoreData: ユビキタス: インポート操作でエラーが発生しました: エラー Domain=NSCocoaErrorDomain Code=134060 "The operation could not be completed. (Cocoa error 134060.)" UserInfo=0x16d882c0 {exception=Only run on the main thread!} userInfo: { exception = "Onlyメインスレッドで実行してください!"; }。次の URL でログ ファイルをインポートしようとしています: transactionLogLocation: : /var/mobile/Library/Mobile Documents/HHHHHHNNNN~com~mycompany~MyApp/CoreData/New Document/duncangroenewald~simAABC628E-9D5E-58F7-9B8D-0BC724C6D0C8/New Document/W8MckEJ0x2d~HZZIeUH2be6hs41TEOONzKIrCuLcuP4=/6C953E7C-B2AF-47F7-B828-DD062B96415D.1.cdt transactionNumber: 5 2013-10-09 07:25:53.809 MyApp[4509:510b] * UserInfo=0x16d882c0 {exception=メイン スレッドでのみ実行!} userInfo: { exception = "メイン スレッドでのみ実行!"; }。次の URL でログ ファイルをインポートしようとしています: transactionLogLocation: : /var/mobile/Library/Mobile Documents/HHHHHHNNNN~com~mycompany~MyApp/CoreData/New Document/duncangroenewald~simAABC628E-9D5E-58F7-9B8D-0BC724C6D0C8/New Document/W8MckEJ0x2d~HZZIeUH2be6hs41TEOONzKIrCuLcuP4=/6C953E7C-B2AF-47F7-B828-DD062B96415D.1.cdt transactionNumber: 5 2013-10-09 07:25:53.809 MyApp[4509:510b] * UserInfo=0x16d882c0 {exception=メイン スレッドでのみ実行!} userInfo: { exception = "メイン スレッドでのみ実行!"; }。次の URL でログ ファイルをインポートしようとしています: transactionLogLocation: : /var/mobile/Library/Mobile Documents/HHHHHHNNNN~com~mycompany~MyApp/CoreData/New Document/duncangroenewald~simAABC628E-9D5E-58F7-9B8D-0BC724C6D0C8/New Document/W8MckEJ0x2d~HZZIeUH2be6hs41TEOONzKIrCuLcuP4=/6C953E7C-B2AF-47F7-B828-DD062B96415D.1.cdt transactionNumber: 5 2013-10-09 07:25:53.809 MyApp[4509:510b] *キャッチされていない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。理由: 'メイン スレッドでのみ実行してください!' *** First throw call stack: (0x2ff23f53 0x3a6996af 0x2ff23e2d 0x308cb1df 0x3796643d 0x37966185 0x3798f7bb 0x379926f7 0x37992759 0x379b378b 0x379b331f 0x379b2f0d 0x3273b05d 0x129717 0x2fee6121 0x2fe5a317 0x3083edcd 0x308436ab 0x118263 0x2fee6121 0x2fe5a317 0x2fd8c69f 0x2fd8cc93 0x2fd813dd 0x3085197b 0x308f5b35 0x3ab83297 0x3ab8309b 0x3ab83d15 0x3ab83f8d 0x3acbedbf 0x3acbec84) libc++abi.dylib: terminatingタイプ NSException のキャッチされない例外あり

編集: ここに、iOS および OSX 用のコア データ/iCloud アプリのサンプルをいくつか投稿しました。これらには、データの読み込み/削除と iCloud 同期のためのバックグラウンド スレッドが含まれています。うまくいけば、ここで説明されている問題に対処できます。http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/

4

4 に答える 4

9

ここでそれを修正しているようです-通知を受信すると別のスレッドで実行されることに気付いていなかったと思います。それは通常の動作ですか、受信するすべての Core Data 通知はバックグラウンド スレッドで呼び出されますか? もしそうなら、あなたがすることは常に正しいスレッドで実行されていることを確認する必要がありますか?

- (void)storesDidUpdate:(NSNotification*)note {
    FLOG(@"storesDidUpdate ");
    [_managedObjectContext mergeChangesFromContextDidSaveNotification:note];

    [[NSOperationQueue mainQueue] addOperationWithBlock:^ {
        //Your code goes in here
        LOG(@" Main Thread Code");

        // Refresh user Interface
        [[NSNotificationCenter defaultCenter] postNotificationName:@"CoreDataUpdatedNotification"
                                                        object:self];
    }];

}

編集:

私はついに、Core Data と iCloud がどのようにしてかなり確実に動作するようになったかを文書化することに取り掛かりました。これには、ユーザーが Use iCloud プリファレンス設定を変更したことに応じて、iCloud との間の移動を処理することも含まれます。コードを機能させる方法を理解しようとしたときに、機能するコードで適切な説明を見つけることができなかったので、これが他の人に役立つことを願っています. アプリの動作のビデオが含まれているので、それがあなたが達成したいことであるかどうかを理解するのに役立つように、どのように動作するかを見ることができます.

http://ossh.com.au/design-and-technology/software-development/

于 2013-10-08T22:13:31.417 に答える
3

私は同じ問題を抱えています。それはまさに@John Rogersが説明した問題でした。作成UITextViewsし、バックグラウンドで URL を呼び出して、生成された s に挿入するデータを取得しましたUITextView。しかし、問題はsendAsynchronousRequestバックグラウンドで呼び出され、私の場合はクラッシュを引き起こすメソッドでした。

データを受信するときにメインスレッドで特定のセレクターを実行することで問題を解決できました。したがって、メソッド呼び出しを別のメソッドに挿入して、次のように呼び出すことができます。

[self performSelectorOnMainThread:@selector(received:) 
                       withObject:data 
                    waitUntilDone:YES];

このようにして、再びメインスレッドに戻ります。

于 2013-11-11T10:44:41.880 に答える
0

はい、わかりましたが、どのスレッドでも何もしていないので、何か他のことが必要です。私は UITextView を更新していますが、何かが失敗を引き起こしている可能性があると思います。なぜこれが ubiquityImporter と関係があるのか​​ はわかりません。おそらく、以下でこのことを解釈できる人が私を正しい方向に向けることができます。どういうわけか間違ったスレッドで何かを実行していますか?

First throw call stack:
(
    0   CoreFoundation                      0x027c55e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x019238b6 objc_exception_throw + 44
    2   CoreFoundation                      0x027c5448 +[NSException raise:format:arguments:] + 136
    3   Foundation                          0x01062960 -[NSAssertionHandler handleFailureInFunction:file:lineNumber:description:] + 101
    4   UIFoundation                        0x01b33131 -[NSLayoutManager(NSPrivate) _resizeTextViewForTextContainer:] + 419
    5   UIFoundation                        0x01b32e16 -[NSLayoutManager(NSPrivate) _recalculateUsageForTextContainerAtIndex:] + 2083
    6   UIFoundation                        0x01b67675 _enableTextViewResizing + 234
    7   UIFoundation                        0x01b6b275 -[NSLayoutManager textStorage:edited:range:changeInLength:invalidatedRange:] + 688
    8   UIFoundation                        0x01b6b2fa -[NSLayoutManager processEditingForTextStorage:edited:range:changeInLength:invalidatedRange:] + 82
    9   UIFoundation                        0x01b93d35 -[NSTextStorage _notifyEdited:range:changeInLength:invalidatedRange:] + 153
    10  UIFoundation                        0x01b93870 -[NSTextStorage processEditing] + 462
    11  UIFoundation                        0x01b93419 -[NSTextStorage endEditing] + 80
    12  UIFoundation                        0x01b934a3 -[NSTextStorage coordinateEditing:] + 66
    13  UIKit                               0x007f4f48 -[UITextView setAttributedText:] + 254
    14  MyApp                        0x00027d7a -[WBSDetailViewController displayItem] + 3146
    15  MyApp                        0x00028c6c -[WBSDetailViewController refreshUI:] + 156
    16  Foundation                          0x01088e39 __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke + 40
    17  CoreFoundation                      0x02821524 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 20
    18  CoreFoundation                      0x0277907b _CFXNotificationPost + 2859
    19  Foundation                          0x00fc2b91 -[NSNotificationCenter postNotificationName:object:userInfo:] + 98
    20  Foundation                          0x00fd206a -[NSNotificationCenter postNotificationName:object:] + 55
    21  MyApp                        0x00031095 -[BaseAppDelegate storesDidUpdate:] + 293
    22  Foundation                          0x01088e39 __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke + 40
    23  CoreFoundation                      0x02821524 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 20
    24  CoreFoundation                      0x0277907b _CFXNotificationPost + 2859
    25  Foundation                          0x00fddd7b -[NSNotificationCenter postNotification:] + 121
    26  CoreData                            0x0173c5f4 -[_PFUbiquityRecordsImporter postImportNotificationForStoreName:andLocalPeerID:withUserInfo:] + 1892
    27  CoreData                            0x0173cbc2 -[_PFUbiquityRecordsImporter operationDidFinish:] + 706
    28  CoreData                            0x0172e8ce -[_PFUbiquityRecordImportOperation main] + 15102
    29  Foundation                          0x0108aa69 -[__NSOperationInternal _start:] + 671
    30  Foundation                          0x01007798 -[NSOperation start] + 83
    31  Foundation                          0x0108cd34 __NSOQSchedule_f + 62
    32  libdispatch.dylib                   0x05b794b0 _dispatch_client_callout + 14
    33  libdispatch.dylib                   0x05b67088 _dispatch_queue_drain + 450
    34  libdispatch.dylib                   0x05b66e85 _dispatch_queue_invoke + 126
    35  libdispatch.dylib                   0x05b67e25 _dispatch_root_queue_drain + 83
    36  libdispatch.dylib                   0x05b6813d _dispatch_worker_thread2 + 39
    37  libsystem_pthread.dylib             0x05f05dab _pthread_wqthread + 336
    38  libsystem_pthread.dylib             0x05f09cce start_wqthread + 30
)
libc++abi.dylib: terminating with uncaught exception of type NSException
于 2013-10-08T21:50:32.677 に答える
0

すべての回答+コメント(および修正)を読む-メインスレッドからのみUIコントロールを更新する必要があることに注意してください。

[self updateDetails];コードを呼び出すと思いself.detailText.attributedText = [self.detailItem valueForKey:@"scope"];ますか?...UI を更新する実際のコードはどれですか?

次に、-performSelectorOnMainThread: を使用して -updateDetails への呼び出しを実行するか、メイン スレッド ( [NSThread isMainThread]) で実行していることを -updateDetails チェックで実行し、そこに UI 更新コードをラップして、呼び出し元が呼び出し元のスレッドを気にしないようにすることができます。 -updateDetails から。

于 2013-11-27T15:08:25.597 に答える