Ios 有人知道这里发生了什么吗?核心数据/iCloud

Ios 有人知道这里发生了什么吗?核心数据/iCloud,ios,objective-c,core-data,icloud,Ios,Objective C,Core Data,Icloud,因此,这里发生的事情是,应用程序刚刚收到了NSPersistentStoredImportubiQuantiousContentChangesNotification,我刚刚打过电话 - (void)storesDidUpdate:(NSNotification*)note { FLOG(@"storesDidUpdate "); [_managedObjectContext mergeChangesFromContextDidSaveNotification:note];

因此,这里发生的事情是,应用程序刚刚收到了
NSPersistentStoredImportubiQuantiousContentChangesNotification
,我刚刚打过电话

- (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的任何一边都发生了爆炸

哦,reloadFetchedResults有点误导,因为我似乎不需要这样做,所以方法名是过去的遗留问题,我所做的只是在这个调用中刷新UI中的值

2013-10-09 07:25:53.783 MyApp[4509:510b]打开ViewController.reloadFetchedResults:调用 2013-10-09 07:25:53.786 MyApp[4509:510b]InfoDetailViewController.reloadFetchedResults:在InfoDetailViewController中调用 2013-10-09 07:25:53.788 MyApp[4509:510b]*无效断言失败 2013-10-09 07:25:53.793 MyApp[4509:510b]-\u p泛素记录组件操作主:核心数据:泛素:导入事务日志时出错: 交易日志位置::/var/mobile/Library/mobile Documents/hhhhnnn~com~mycompany~MyApp/CoreData/New Document/duncangroenewald~simAABC628E-9D5E-58F7-9B8D-0BC724C6D0C8/New Document/W8MckEJ0x2d~hzzieuh2b6hs41teoonzkirculcup4=/6C953E7C-B2AF-47F7-B828-DD062B96415D.1.cdt 交易号码:5 ,异常:仅在主线程上运行! 用户信息:(空) 2013-10-09 07:25:53.803 MyApp[4509:510b]-\u p泛素RecordsImporter操作:failedWithError::CoreData:Ubiquity:Import操作遇到错误:错误域=NSCOCAerorDomain代码=134060“操作无法完成。(可可错误134060)。“UserInfo=0x16d882c0{异常=仅在主线程上运行!} 用户信息:{ exception=“仅在主线程上运行!”; }。尝试在URL处导入日志文件时: 交易日志位置::/var/mobile/Library/mobile Documents/hhhhnnn~com~mycompany~MyApp/CoreData/New Document/duncangroenewald~simAABC628E-9D5E-58F7-9B8D-0BC724C6D0C8/New Document/W8MckEJ0x2d~hzzieuh2b6hs41teoonzkirculcup4=/6C953E7C-B2AF-47F7-B828-DD062B96415D.1.cdt 交易号码:5 2013-10-09 07:25:53.809 MyApp[4509:510b]*由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因是:“仅在主线程上运行!” ***第一次抛出调用堆栈: (0x2ff23f53 0x3a6996af 0x2ff23e2d 0x308cb1df 0x3796643d 0x37966185 0x3798f7bb 0x379926f7 0x37992759 0x379b378b 0x379b331f 0x379b2f0d 0x3273b05d 0x129717 0x2fee6121 0x2fe5a317 0x3083edcd 0x308436ab 0x118263 0x2FEEE6121 0x2fe5a317 0x2fd8c69f 0x2fd8cc93 0x2FD817D 0x3085197b 0x30837B 0x3AB837B 0x3AB837B 0x3AB838D 0x3AB835D 0x308BF 0x3AB835D) libc++abi.dylib:以NSException类型的未捕获异常终止

编辑:
我在这里发布了一些iOS和OSX的核心数据/iCloud应用示例-它们包括用于加载/删除数据的后台线程以及iCloud同步。希望解决这里描述的问题

是的,我明白了,但我在任何线程上都不做任何事情,所以必须做其他事情。我正在更新UITextView,我想可能是中的某些内容导致了失败。我不清楚为什么这与泛素导入器有关——也许有人能解释下面的内容,能为我指明正确的方向。我是不是走错方向了

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

好的,这里是什么似乎修复它-我想我从来没有意识到,收到通知将运行在另一个线程。这是正常行为吗?您收到的所有核心数据通知都是在后台线程上调用的吗?如果是这样的话,您是否总是必须确保您所做的任何事情都在正确的线程上运行

- (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];
    }];

}
编辑:

我终于开始记录我是如何让核心数据和iCloud非常可靠地工作的,包括处理移动到iCloud和从iCloud移动以响应用户更改其使用iCloud首选项设置的。当我试图找出如何使其工作时,我无法找到一个关于工作代码的好解释,所以我希望这对其他人有用。包括一个应用程序工作的视频,这样你可以看到它的行为,以帮助你找出它是否是你想要实现的


我也遇到了同样的问题。约翰·罗杰斯解释说,这正是问题所在。 我创建了
UITextView
,在后台我调用了一个URL来获取一些数据,这些数据应该插入到我生成的
UITextView
s中。但是问题是方法
sendAsynchronousRequest
,它将在后台调用,并在我的例子中导致崩溃

我可以通过在接收数据时在主线程上执行特定的选择器来解决这个问题。因此,您可以将您的方法调用插入到另一个方法中,并以这种方式调用它:

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

这样,您就可以再次回到主线程。

阅读所有答案和注释(以及您的修复)-我认为应该注意的是,您必须仅从主线程更新任何UI控件

我想<