我已经使用过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/

10-09 04:01