Objective-C类之间的iOS回调函数

时间:2013-08-05 01:20:39

标签: objective-c

我是iPhone应用程序开发的新手,但到目前为止我似乎已经进行了一些管理(随时随地学习)..然而,我遇到了一个我无法弄清楚的问题。这是场景:

我有一个名为CoreAPI的扩展类,里面有我的网络功能。我在CoreAPI中有一个名为“Login”的函数,它向服务器发出请求,得到0或1响应并返回true或false。我让它与同步请求完美配合,但现在我需要将所有内容都异步。

所以,下面是我正在尝试做的...这不符合“类型ID的对象没有方法loginCallback”的错误

loginViewController.m

- (void) login {
    CoreAPI APIObject = [[CoreAPI alloc] init];
    [APIObject login:self];
}

- (void) loginCallback {
    NSLog(@"It called back.");
}

CoreAPI.m

- (void)login:(id)sender {
    [sender loginCallback];
}

谢谢,如果我错过了帮助我的任何细节,请告诉我。

2 个答案:

答案 0 :(得分:1)

我看到了几个问题。首先,我猜你没有向CoreAPI.m提供loginCallback函数的可见性。您应该能够将任何消息发送到id类型,只要它是针对已知类型定义的。

但是,我建议在这种情况下使用完成块。这可能是这样的:

(在CoreAPI.h中)

- (void)login:(void (^)(void))completed;

(在CoreAPI.m中)

- (void)login:(void (^)(void))completed {
    // Login code
    if (completed) completed();
}

调用它看起来像:

CoreAPI APIObject = [[CoreAPI alloc] init];
[APIObject login:^{
     NSLog(@"It called back.");
}];

他们有非常愚蠢的语法,但是块对于这种事情非常好。希望这有帮助!如果我没有清楚地解释一下,请告诉我。

答案 1 :(得分:0)

这应该可以帮到你:

首先,在CoreApi.m

中导入loginViewController标头
#import "loginViewController.h"

然后,将登录方法更改为:

- (void)login:(id)sender {
    [(loginViewController*)sender loginCallback];
}

或者这个:

- (void)login:(loginViewController*)sender {
        [sender loginCallback];
}

说明:请注意您的登录方法是通过参数id类型的对象接收的。在目标C中,id类型表示对未知类的任何Objective-C的引用。因此,在您的登录方法中,编译器不知道发件人是您的loginViewController类的实例,因此它不会识别loginViewController的方法。

有关此信息,请阅读:Objective-C: difference between id and void *

请注意,我只专注于删除您的实际错误。您必须做更多的事情才能完成代码以便异步运行。

为了执行更好的回调,请查找代表或块(如oltman的回答)。

要在后台运行,请查找CDG:http://developer.apple.com/library/ios/#DOCUMENTATION/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html