预警 - 代码示例有点长...
我有一个单身的NSMutableArray可以从任何地方我的应用程序中进行访问。 我希望能够引用NSMutableArray
从多个NIB文件,但结合到通过UI元素NSArrayController
对象。 创建初期是没有问题的。 我可以引用单NSMutableArray
当笔尖被加载和一切显示正常。
然而,改变NSMutableArray
通过添加或删除对象不会踢掉志愿更新NSArrayController
实例。 我认识到,“更改控制器的背后”被认为是可可土地不走的一部分,但我没有看到的编程方式更新任何其他方式NSMutableArray
,让每一个NSArrayController
通知(除非它不工作的课程...)。
我已经简化了下面的类来解释。
简化的单例类的头:
@interface MyGlobals : NSObject {
NSMutableArray * globalArray;
}
@property (nonatomic, retain) NSMutableArray * globalArray;
简化的单方法:
static MyGlobals *sharedMyGlobals = nil;
@implementation MyGlobals
@synthesize globalArray;
+(MyGlobals*)sharedDataManager {
@synchronized(self) {
if (sharedMyGlobals == nil)
[[[self alloc] init] autorelease];
}
return sharedMyGlobals;
}
-(id) init {
if(self = [super init]) {
self.globals = [[NSMutableArray alloc] init];
}
return self
}
// ---- allocWithZone, copyWithZone etc clipped from example ----
在该简化的例子为数组中的对象的头部和型号:
头文件:
@interface MyModel : NSObject {
NSInteger myId;
NSString * myName;
}
@property (readwrite) NSInteger myId;
@property (readwrite, copy) NSString * myName;
-(id)initWithObjectId:(NSInteger)newId objectName:(NSString *)newName;
@end
方法文件:
@implementation MyModel
@synthesize myId;
@synthesize myName;
-(id)init {
[super init];
myName = @"New Object Name";
myId = 0;
return self;
}
@end
现在想象有两个合适的NIB文件NSArrayController
实例。 我们会打电话给他们myArrayControllerInNibOne
和myArrayControllerInNib2
。 在每个阵列控制器init
所述NIB控制器的设定数组的内容:
// In NIB one init
[myArrayControllerInNibOne setContent: [[MyGlobals sharedMyGlobals].globalArray];
// In NIB two init
[myArrayControllerInNibTwo setContent: [[MyGlobals sharedMyGlobals].globalArray];
当每个NIB初始化NSArrayController
正确结合,以共享的阵列,我可以看到在UI数组内容如你所愿。 我有一个单独的后台线程,更新时,基于外部事件内容发生变化的全球阵列。 当对象需要在此背景线程以复加,我只是将它们添加到数组如下:
[[[MyGlobals sharedMyGlobals].globalArray] addObject:theNewObject];
这就是事情土崩瓦解。 我不能叫一个willChangeValueForKey
和didChangeValueForKey
全球阵列上,因为共享的实例没有一个键值(要我在单身类中增加这个?)
我火了一个NSNotification
和捕捉,在NIB控制器,要么做一个[myArrayControllerInNibOne rearrangeObjects]
; 或将内容设置为nil
并重新分配内容数组-但是这两个似乎是黑客和。 此外,设置NSArrayController
到nil
,然后返回到全局阵列使UI内的视觉闪光灯作为内容被清除并重新填充。
我知道我可以直接添加到NSArrayController
和数组被更新,但我没有看到一)等如何NSArrayController
情况下,将更新和b)我不想明确地配合我的后台线程类的实例NIB (我也不应该有)。
我认为,正确的做法是要么莫名其妙断火的志愿通知周围的addObject
在后台线程,或添加什么东西正在被存储在全局阵列中的对象。 但我不知所措。
作为一个值得注意的问题,我不使用核心数据。
任何帮助或援助将是非常赞赏。