在其他人完成之前调用的方法

时间:2013-10-27 13:45:41

标签: ios httprequest

在我的项目中,我有以下方法:

-(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]在收到数据之前不会被调用?

1 个答案:

答案 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”,,命名约定意味着完全不同的用法。