1

我是 iPhone 应用程序开发的新手,但到目前为止我似乎有所管理(边学习边学习)。但是,我遇到了一个我无法弄清楚的问题。这是场景:

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

所以,下面是我想要做的..这不适用于“类型 ID 的对象没有方法 loginCallback”的错误

登录视图控制器.m

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

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

核心API.m

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

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

4

2 回答 2

1

我看到了几个问题。首先,我猜你没有loginCallback向 CoreAPI.m 提供函数的可见性。您应该能够将任何消息发送到一个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.");
}];

它们的语法非常愚蠢,但是对于这类事情来说,块真的很好。希望这有帮助!如果我没有清楚地解释某些事情,请告诉我。

于 2013-08-05T01:42:56.890 回答
0

这应该为您解决问题:

首先,在 CoreApi.m 中导入 loginViewController 标头

#import "loginViewController.h"

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

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

或这个:

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

说明:请注意,您的登录方法通过参数一个类型的对象接收id。在 Objective C 中,id类型表示对任何未知类的 Objective-C 的引用。所以,在你的 login 方法中,编译器不知道 sender 是你 loginViewController 类的一个实例,所以它不会识别 loginViewController 的方法。

有关这方面的信息,请阅读:Objective-C:id 和 void 之间的区别 *

请注意,我只专注于消除您的实际错误。你应该做更多的事情来完成你的代码以异步运行。

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

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

于 2013-08-05T01:41:38.133 回答