在我的项目中,我有以下方法:
-(NSArray*)getWindSpeed
{
[client setURL:@"windspeed"];
NSLog(@"Wind speed asked");
[client getData];
return [self Parse];
}
-(NSArray *)Parse
{
NSLog(@"parsing");
return [parser parseJSONData:rawData];
}
当调用getWindSpeed时,它首先更改我所创建的httpclient的url,然后请求输入数据。在客户端的getData方法中,我执行httprequest,当它接收数据时,它将数据存储在数组中。然后我想返回解析后的数据。 但是,在我的客户端的getData函数完成之前调用Parse方法。
因此解析器接收的rawData始终为null。
我猜这是因为[self Parse]在客户端的
之前被调用- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
那么......关于如何实现这一点的任何提示[self Parse]在收到数据之前不会被调用?
答案 0 :(得分:1)
你不能按照你想要的方式做到这一点。从异步操作/方法/函数同步返回是不可能的(或者至少没有意义)。
你必须继承基于事件的异步模型,i。即不要尝试返回已解析的数据,而是让调用者在您从connection:didFinishLoading:
委托方法中调用的回调块中传递。
例如:
- (void)requestWindSpeedWithBlock:(void(^)(NSArray *))callback
{
[client setURL:@"windspeed"];
NSLog(@"Wind speed asked");
[client loadData];
dataAccumulator = [NSMutableData new];
callbackBlock = callback;
}
- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data
{
[dataAccumulator appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)conn
{
NSArray *array = [parser parseData:dataAccumulator];
callbackBlock(array);
}
另请注意更改的方法名称。 不要在方法名称前添加“get”,,命名约定意味着完全不同的用法。