ios - 在 Objective C 中动态设置和取消设置事件监听器

标签 ios objective-c asynchronous delegates

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

相关文章:

ios - 像素完美 UILabel

c# - 等待最后的方法调用

javascript - JavaScript 异步编程的新手。有什么建议吗?

ios - 渲染一个任意大的 NSAttributedString

ios - 无法使用 SwiftUI 实现暗模式

objective-c - iPhone UISearchBar 示例

objective-c - 给私有(private)方法和属性添加前缀

objective-c - 将空格序列折叠成单个字符并修剪字符串

iphone - 调用 initWithNibName 后在 iPhone 4.3 模拟器上运行时应用程序崩溃

c# - 页面之间的套接字?