无法在目标 c 中调用方法

Posted

技术标签:

【中文标题】无法在目标 c 中调用方法【英文标题】:Cannot call method in objective c 【发布时间】:2014-08-29 13:13:16 【问题描述】:

我很难理解如何调用方法。代码如下:

- (void)beachJSON

// Build the string to call Beach API
NSString *urlString = [NSString stringWithFormat:@"http://nrw-bwq-dev-api.azurewebsites.net/api/Pull"];

// Create NSURL string from formatted string
NSURL *url = [NSURL URLWithString:urlString];

// Setup and start async download
NSURLRequest *request = [[NSURLRequest alloc] initWithURL: url];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection release];
[request release];


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

// Store incoming data into a string
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];


results = [jsonString JSONValue];




- (NSArray *)getBeachList 
[self beachJSON];

return results;

我从另一个类调用 getBeachList 来填充“结果”,beachJSON 调用很好,但我需要调用

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

- (NSArray *)getBeachList

即就在这里

- (NSArray *)getBeachList 
[self beachJSON];
//This is where I want to call it to populate results before it is returned
return results;

调用 getBeachList 将调用 beachJSON,但连接方法将被跳过而留下 'results' nil

如果我尝试简单地放置

[self connection:(NSURLConnection *)connection didReceiveData:(NSData *)data]

我在该行收到预期的表达式错误。

我对目标 c 很陌生,所以任何帮助都会很棒。

【问题讨论】:

【参考方案1】:

您不需要调用此方法。 它是 NSURLConnection 的委托方法。 您需要为连接设置一个委托,并在下载任何数据时由连接调用方法。

【讨论】:

您能否通过设置连接代表来扩展您的意思? @Marushiru,对不起,您在连接初始化时这样做了。如果你写了 [.. initWithRequest:... delegate:self] 那么连接对象将调用 -connection:didReceiveData:。您不应该从 getBeachList 方法返回任何内容。您需要设置对连接实例的强引用。你必须[连接开始]。下载将开始,您将在 didReceiveData: 中获得数据片段作为参数。您应该连接交付的每个数据对象的内容,以构建 URL 加载的完整数据。如果您阅读“URL 加载系统编程指南”,您将获得更多信息。【参考方案2】:

你不应该自己打电话给connection:didReceiveData:。这是一个只应该由NSURLConnection 实例触发的事件。据我所知,您唯一缺少的是 start 调用,它实际上使 NSURLConnection 执行请求。

试试这个:

NSURLRequest *request = [[NSURLRequest alloc] initWithURL: url];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];

然后您应该看到您的NSURLConnection 实例将调用您的connection:didReceiveData: 实现。

如果您想确保您的数据已完全加载,您应该改用此事件:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

如果您的数据量足够大,connection:didReceiveData: 将被多次调用。每次NSURLConnection 收到数据时,它都会调用connection:didReceiveData:connectionDidFinishLoading: 只会在您的所有数据准备就绪时调用一次。

【讨论】:

对不起,我应该指定 getBeachList 是从另一个类调用的。因此,每次调用它时, beachJSON 都会起作用,但会跳过连接方法。这使我的结果返回为零。 指定了什么? :) 如果您不满意,请编辑您的问题。 我已经进一步编辑了我的问题,以阐明我想要做什么。当我发布它时应该确保它是 100% 清晰的 D:

以上是关于无法在目标 c 中调用方法的主要内容,如果未能解决你的问题,请参考以下文章

无法从 CDVPlugin 类目标 c 和 phonegap 调用 MainViewController 的静态方法

在目标 c 中调用 super.super 上的方法?

目标C:有没有办法在另一个方法中调用一个方法的完成块?

如何将 NSData 参数传递给在 swift 3 中调用的目标 c 方法?

如何在目标 c 中使用 GCD dispatch_async 调用/编写以下方法

spring aop无法拦截类内部的方法调用