在Objective C中动态设置和取消设置事件侦听器

时间:2016-01-30 21:21:33

标签: ios objective-c asynchronous delegates

我已经使用了几次obj c代表并且知道它们的基本用法。但我有以下问题:

我使用Dropbox SDK for iOS并使用他们的内置委托方法进行DeltaEntriesLoaded。但我在代码中从两个不同的位置使用它。从第一个位置我想做“正常的东西”,但是从加载delta条目后我想要的第二个位置来访问由此DeltaEntries方法填充的数组。

所以,我有一个调用LoadDelta的类,但是根据它调用它的时间,它需要在加载DeltaEntries之后才有不同的行为。我该如何解决?

1 个答案:

答案 0 :(得分:1)

问题是只能将一个对象声明为将调用deltaEntriesLoaded的委托,但是您需要在多个地方调用它吗?

创建一个与DropboxSDK交互的中间对象可能是个好主意。例如,您可能有一个DropboxManager单例对象作为委托。 DropboxManager将有一个DropboxManagerListeners数组 - 代码中的对象需要在加载增量条目时得到通知。然后,DropboxManager将遍历侦听器并在每个侦听器上调用deltaEntriesLoaded,以通知它们。

伪代码将是:

DropboxManager.h

@protocol DropboxManagerListener <NSObject>

- (void)deltaEntriesLoaded:(NSArray *)deltaEntries;

@end

@interface DropboxManager : NSObject

+ (DropboxManager *)sharedManager

- (void)addListener:(id<DropboxManagerListener *>) listener;

@end

DropboxManager.m

@interface DropboxManager () <DropboxDelegate>

@property (copy, nonatomic) NSArray<DeltaManagerListener *> *listeners;

@end

@implementation

+ (DropboxManager *)sharedManager {
    static DropboxManager *sharedManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedManager = [[self alloc] init];
        //set sharedManager as the DropboxSDKDelegate here
    });
    return sharedManager;
}

- (void)addListener:(id<DropboxManagerListener *>)listener {
    self.listeners = //code to do self.listeners + listener
}

- (void)deltaEntriesLoaded:(NSArray *)deltaEntries { //Delegate method from Dropbox SDK 
    for id<DeltaManagerListener *> listener in self.listeners {
         [listener deltaEntriesLoaded:deltaEntries];
    }
}

@end

因此,当您需要通知对象deltaEntriesLoaded时,只需确保它们符合DropboxManagerListener协议并通过调用[[DropboxManager sharedManager] addListener:yourObject];

将自己添加为侦听器

将处理第三方的任何代码分成一个单独的类并让其他代码与中间类交互是很好的。这样,如果您最终需要切换到其他第三方,则可能不必更改尽可能多的代码。