无法在目标 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 的静态方法
如何将 NSData 参数传递给在 swift 3 中调用的目标 c 方法?