我读到了Change the delegate of MGTwitterEngine并且没有真正理解它。我希望有人能再解释一下。
根据我所知,我为MGTwitterEngine创建了一个包装器,并在包装器中设置了委托。所以为了更容易,我尝试为接口安装一个NSArray实例,我会在需要时传递它。
以下是收到状态的代码:
- (void)statusesReceived:(NSArray *)statuses forRequest:(NSString *)connectionIdentifier
{
//NSLog(@"Got statuses for %@:\r%@", connectionIdentifier, statuses);
[statusIds setObject:statuses forKey:connectionIdentifier];
}
所以我希望项目中的任何对象都可以访问sharedTwitterEngine,只要我首先请求信息,然后使用新结果释放statusContainer并将其传递给我的工作对象供以后使用。
我不确定这是不是正确的方法,还是有更简单的方法让我错过了?
答案 0 :(得分:1)
S.O.提出的解决方案。发布链接可以通过这种方式实现:
1)为MGTwitterEngine创建一个包装器;这个包装器将公开你需要MGTwitterEngine的任何选择器,并将为每个选择器添加一个参数,该参数标识正在调用它的视图控制器;
2)你的MGTwitterEngine包装器将作为发送的所有请求的唯一代理;
3)对于包装器从视图控制器接收的每个请求,包装器将视图控制器地址存储在与twitter id关联的NSMutableDictionary中;
4)当响应返回时,委托(与包装器是同一个对象)将找出最初发送请求的视图控制器(通过在字典中搜索响应附带的twitter id),并转发对它的回应。
我希望这有帮助......
编辑:
这就是你如何做到的(我只包括一个API调用和相关代码):
@interface TwitterClientViewController : UIViewController <MGTwitterEngineDelegate> {
}
@end
@implementation TwitterClientViewController;
- (void)requestListOfUsers:(NSString*)username {
[twitterEngineSingleton getListsForUser:username requestDelegate:self];
}
- (void)requestSucceeded:(NSString*)connectionIdentifier {
NSLog(@"Hello");
}
@end
@interface AdvancedTwitterEngine : NSObject <MGTwitterEngineDelegate> {
MGTwitterEngine* _engine;
NSMutableDictionary* _callerIds;
}
-(NSString*)getListsForUser:(NSString*)username requestDelegate:(id<MGTwitterEngineDelegate>)delegate;
@end
@implementation AdvancedTwitterEngine;
-(void)init {
if (self = [super init]) {
_engine = [[MGTTwitterEngine alloc] initWithDelegate:self];
_callerIds = <init>
}
return self;
}
-(NSString*)getListsForUser:(NSString*)username requestDelegate:(id<MGTwitterEngineDelegate>)delegate {
NSString* twId = [_engine getListsForUser:username];
[_callerIds setObject:controller forKey:twId];
return twId;
}
//-- delegate methods
- (void)requestSucceeded:(NSString*)connectionIdentifier {
id<MGTwitterEngineDelegate> dlg = [_callerIds objectForKey:connectionIdentifier];
[dlg requestSucceeded:connectionIdentifier];
}
@end