我已经使用过几次 obj c 委托(delegate),并且知道它们的基本用法。但是我有以下问题:
我使用适用于 iOS 的 Dropbox SDK,并将其内置的委托(delegate)方法用于 DeltaEntriesLoaded。但是我在代码中的两个不同位置使用它。从第一个位置开始,我想做我的“正常工作”,但从第二个位置开始,我想在加载增量条目后立即访问由此 DeltaEntries 方法填充的数组。
因此,我有一个调用 LoadDelta 的类,但根据调用它的时间,它需要在加载 DeltaEntries 后立即具有不同的行为。我该如何解决?
最佳答案
问题是只能将一个对象声明为将调用 deltaEntriesLoaded
的委托(delegate),但您需要在多个地方调用它吗?
创建一个与 DropboxSDK 交互的中间对象可能是个好主意。例如,您可能有一个充当委托(delegate)的 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 协议(protocol)并通过调用 [[DropboxManager sharedManager] addListener 将自己添加为监听器:你的对象];
最好将与第三方打交道的所有代码分离到一个类中,并让其他代码与中间类交互。这样,如果您最终需要切换到不同的第三方,您可能不必更改那么多代码。
关于ios - 在 Objective C 中动态设置和取消设置事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35107269/