NSArrayController的rearrangeObjects错误(NSArrayContro

2019-09-21 13:50发布

我有一个NSArrayController的rearrangeObjects功能的麻烦 - 该功能由一些背景胎面,有时应用程序错误崩溃叫:“叫endUpdates没有beginUpdates”。

我怎样才能检测是否arrayController在当前时刻清理对象,并添加下一重排一些像队列或取消当前的清理和运行新的?

可能有此问题的另一个解决方案?

编辑程式码:

TableController implementation:

- (void)setContent{//perfoms on main thread
     //making array of content and other functions for setting-up content of table
     //...
     //arrayController contains objects of MyNode class
     //...
     //end of setting up. Call rearrangeObjects
     [arrayController rearrangeObjects];
}

- (void)updateItem:(MyNode *)sender WithValue:(id)someValue ForKey:(NSString *)key{
     [sender setValue:someValue forKey:key];
     [arrayController rearrangeObjects];//exception thrown here
}

MyNode implementation:

- (void)notifySelector:(NSNotification *)notify{
     //Getted after some processing finished
     id someValue = [notify.userInfo objectForKey:@"observedKey"];
     [delegate updateItem:self WithValue:someValue ForKey:@"observedKey"];
}

Answer 1:

不要那样做。 AppKit的(到NSArrayController所属)一般不线程安全的。 相反,使用-performSelectorOnMainThread:...更新您的UI(包括NSArrayController )。 始终执行更新的主线程上。



Answer 2:

约书亚和丹的解决方案是正确的。 它很有可能是你在后台线程,然后接触到阵列控制器,因此触摸表执行你的模型对象上操作。

NSTableView的本身不是线程安全的。 只需在“beginUpdates / endUpdates”对加入只会避免对位的竞争条件。 然而,像鳍指出,这可能是好做一对出于性能方面的更新,但它不会崩溃帮助。

为了找到坠毁的来源,在代码中添加一些断言上[NSThread currentThread] .mainThread - 尤其是没有任何地方你触摸阵列控制器的内容之前。 这将帮助您解决问题。 或者,子类NSTableView的,并添加断言在关键的地方,如覆盖-numberOfRows (这是经常呼吁改变),并调用超。

-corbin
了AppKit / NSTableView的



Answer 3:

我通过我的UI初始化的一开始加入这个解决了这个

[myTableView beginUpdates];

然后在持续性店后年底已完全加载:

[myTableView endUpdates];

这也使应用程序启动时好了很多,因为它不会不断地重新加载从MOC所有负载。



文章来源: NSArrayController rearrangeObjects error