【发布时间】:2021-06-25 23:26:09
【问题描述】:
我来自 Javascript 背景,我的界面/实现对我来说是新的。
假设我有一个参与者,其接口和实现如下所示
Participant.h 文件
#import <Foundation/Foundation.h>
@interface Participant : NSObject
@property(nonatomic, assign, readonly) NSString *name;
@property(nonatomic, assign, readonly) NSString *id;
@property(nonatomic, assign, readonly) NSString *gender;
+ (instancetype _Nonnull)sharedInstance;
@end
Participant.m 文件
@implementation Participant
- (instancetype)init {
if (self = [super init]) {
[self setAllValueNil];
[self initMessageEmit];
}
return self;
}
-(void)setAllValueNil {
_name = nil;
_id = nil;
_gender = nil;
}
- (void)initMessageEmit {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receiveNotification:)
name:@"participantReciever"
object:nil];
}
+ (instancetype)sharedInstance {
static Participant *sharedInstance = nil;
static dispatch_once_t OnceToken;
dispatch_once(OnceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (void) dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void) receiveNotification:(NSNotification *) notification
{
if ([[notification name] isEqualToString:@"participantReciever"]) {
if (notification.userInfo[@"value"] != nil) {
if ([notification.userInfo[@"type"] isEqualToString:@"setName"]) {
_name = notification.userInfo[@"value"]
}
}
}
此代码适用于单个参与者,但如果我有多个参与者,我将如何编写上述代码?有人可以分享一个例子吗?其中 id 是唯一键
【问题讨论】:
-
不清楚问题是什么。如果您有多个参与者,您将丢弃您的
sharedInstance方法,这会使其成为单例。如果你需要我的建议,无论如何你都应该把它扔掉。即使在 JavaScript 中也有类和实例的概念(有点)。 ——我以前建议过这个;为什么不学习 Objective-C 而不是折腾? -
无需显式设置属性为
nil;这是为你完成的。正如@matt 所说,这个对象没有理由成为单例,特别是因为你已经说过你想要多个实例。使用通知集你的属性也是不必要的复杂;您通常会引用对象实例并简单地设置属性。您可以使用uuid作为唯一键,尽管这对于内存中的对象来说是不寻常的。您可以将它传递给初始化程序,也可以让初始化程序随机分配一个。 -
我注意到您已将属性设置为只读。这消除了简单的属性设置器。这真的是您的意图吗,因为您在问题标题中询问“如何更新其价值”?你能edit你的问题更清楚地解释你想要做什么吗?
-
嘿@matt!感谢您的评论。当然,这是最好的方法,我会这样做。上面的代码 sn-p 适用于单个参与者,而不是参与者。
标签: ios objective-c xcode