我的应用程序中有一些Realm模型都使用基类。在本课程中,我编写了一些通用函数,如下所示:
- (void)save {
self.updatedAt = [NSDate date];
[self.realm beginWriteTransaction];
[self.realm addOrUpdateObject:self];
[self.realm commitWriteTransaction];
[[SyncEngine sharedInstance] store:self];
}
现在,我还写了一个名为SyncEngine
的类,它检查是否启用了一些可用的同步方法,然后调用它们:
- (void)store:(id)object {
if ([Preferences CloudKitEnabled]) {
[self.cloudKit store:object];
}
}
这是我的问题出现的地方。我编写了一个名为CloudKitManager
的基类,它有一些通用函数。然后,我为我的应用中的每个模型创建了一个特定的CloudKitClass
,因此我最终会得到CloudKitRestaurant
和CloudKitTable
。所有这些都将包含一个函数(void)store:(id)sender
。根据存储在Realm中的类,调用特定CloudKit类的存储函数的最佳方法是什么?
理想情况下,我希望RLMRestaurant
自动使用CloudKitRestaurant
,而不必使用if else或switch语句。
为了进一步明确,这就是SyncEngine
的工作原理。
@interface SyncEngine()
@property (nonatomic, strong) CloudKitManager *cloudKitManager;
@end
@implementation SyncEngine
static SyncEngine *sharedInstance = nil;
+ (SyncEngine *)sharedInstance {
if (sharedInstance == nil) {
sharedInstance = [[self alloc] init];
}
return sharedInstance;
}
- (instancetype)init {
self = [super init];
if (self) {
self.cloudKitManager = [[CloudKitManager alloc] init];
}
return self;
}
@end
答案 0 :(得分:0)
在我看来,你应该在CloudKitManager
对象中保留RLMBase
类的类型。当您需要致电[[CloudKitManager sharedInstance] store:object]
时,请致电[[object.cloudKitClass sharedInstance] store:object]
。
请尝试下面的代码。
@interface RLMBase : NSObject
- (Class)cloudKitClass;
@end
@implementation RLMBase
- (Class)cloudKitClass {
// Must be overridden in subclass.
return CloudKitManager.class;
}
@end
@interface RLMRestaurant : RLMBase
@end
@implementation RLMRestaurant
- (Class)cloudKitClass {
return CloudKitRestaurant.class;
}
@end
- (void)store:(RLMBase *)object {
if ([Preferences CloudKitEnabled]) {
[[object.cloudKitClass sharedInstance] store:object];
}
}
另一种方式
将store:
方法从SyncEngine
放到RLMBase
对象。
@interface RLMBase : NSObject
- (Class)cloudKitClass;
- (void)store;
@end
@implementation RLMBase
- (Class)cloudKitClass {
// Must be overridden in subclass.
return CloudKitManager.class;
}
- (void)store {
if ([Preferences CloudKitEnabled]) {
[[self.cloudKitClass sharedInstance] store:self];
}
}
@end
save
方法将成为
- (void)save {
self.updatedAt = [NSDate date];
[self.realm beginWriteTransaction];
[self.realm addOrUpdateObject:self];
[self.realm commitWriteTransaction];
[self store];
}