预警 - 代码示例有点长...
我有一个可以从我的应用程序中的任何位置访问的单例 NSMutableArray。我希望能够NSMutableArray
从多个 NIB 文件中引用,但通过NSArrayController
对象绑定到 UI 元素。初始创建不是问题。NSMutableArray
当NIB被加载并且一切看起来都很好时,我可以引用单例。
但是,NSMutableArray
通过添加或删除对象来更改并不会启动 KVO 来更新NSArrayController
实例。我意识到“在控制器背后改变”被认为是 Cocoa-land 的一个不可行的部分,但我没有看到任何其他方式以编程方式更新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
NSArrayController
现在想象两个具有适当实例的NIB 文件。我们会打电话给他们myArrayControllerInNibOne
和myArrayControllerInNib2
。init
NIB 控制器中的每个数组控制器设置数组的内容:
// In NIB one init
[myArrayControllerInNibOne setContent: [[MyGlobals sharedMyGlobals].globalArray];
// In NIB two init
[myArrayControllerInNibTwo setContent: [[MyGlobals sharedMyGlobals].globalArray];
当每个 NIBNSArrayController
正确初始化绑定到共享数组时,我可以在 UI 中看到您所期望的数组内容。我有一个单独的后台线程,当内容基于外部事件发生更改时,它会更新全局数组。当需要在这个后台线程中添加对象时,我只需将它们添加到数组中,如下所示:
[[[MyGlobals sharedMyGlobals].globalArray] addObject:theNewObject];
这就是事情分崩离析的地方。我不能在全局数组上调用willChangeValueForKey
anddidChangeValueForKey
因为共享实例没有键值(我应该在单例类中添加它吗?)
我可以在 NIB 控制器中触发NSNotification
并捕获它,然后执行[myArrayControllerInNibOne rearrangeObjects]
; 或将内容设置为并将内容nil
重新分配给数组 - 但这两者似乎都是黑客和。此外,将 to 设置NSArrayController
为nil
然后返回到全局数组会导致 UI 内的视觉闪烁,因为内容被清除并重新填充。
我知道我可以直接添加到NSArrayController
并且数组得到更新,但我没有看到 a)其他NSArrayController
实例将如何更新和 b)我不想将我的后台线程类显式绑定到 NIB 实例(也不我应该这样做)。
我认为正确的方法是在后台线程中以某种方式触发 KVO 通知addObject
,或者向存储在全局数组中的对象添加一些东西。但我不知所措。
需要注意的是,我没有使用 Core Data。
任何帮助或帮助将不胜感激。