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