从NSObject调用函数

时间:2013-11-29 23:53:09

标签: ios class uiviewcontroller nsobject

我正在开发iOS应用。我创建了一个从服务器中提取数据的类。但是,当请求收到数据时,我需要调用创建类实例的视图控制器内的方法。

Request.m

- (id)initWithDictionary:(NSMutableDictionary *)dict
{
    if (self = [super init]) {
        [[API sharedInstance] commandWithParams:dict onCompletion:^(NSDictionary *json) {
                                   for (NSString* key in json) {
                                       //call method in view controller
                               }];
    }
    return self;
}

在某些视图控制器中:

//how I submit the request
Request *myRequest = [[Request alloc] initWithDictionary:myDict];

//the method I need to call onCompletion:
- (void)receivedRequest{}

如果有人可以现场就如何做到这一点,我将非常感激!

2 个答案:

答案 0 :(得分:3)

这是代表设计模式的教科书应用程序:

设置协议。我们称之为requestProtocol。

定义Request对象在请求协议中需要调用的方法。

为您的Request类提供委托属性。设置委托以符合您的requestProtocol。

当您的视图控制器创建请求对象时,请将其自身设置为委托。

(这意味着您的视图控制器需要符合您的requestProtocol)

在您的Request对象中,当您开始解析JSON密钥时,请调用委托的receivedRequest方法。

答案 1 :(得分:1)

授权的另一种方法是使用基于块的API,根据场景更方便。

- (id)initWithDictionary:(NSMutableDictionary *)dict requestCompletionHandler:(void(^)(NSString*, id))completionHandler
{
    if (self = [super init]) {
        [[API sharedInstance] commandWithParams:dict onCompletion:^(NSDictionary *json) {
                                   if(completionHandler == nil) return;
                                   for (NSString* key in json) {
                                       completionHandler(key, json[key]);
                               }];
    }
    return self;
}

但我建议采用略有不同的方法实施。您不应该使用init方法执行请求,而是在调用start方法后执行请求。