如何为全局类调用特定函数?

时间:2017-12-03 11:59:36

标签: ios objective-c realm cloudkit

我的应用程序中有一些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,因此我最终会得到CloudKitRestaurantCloudKitTable。所有这些都将包含一个函数(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

1 个答案:

答案 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];
}