0

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

-(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 始终为空。

我猜这是因为 [self Parse] 在客户端之前被调用

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

所以..关于如何使 [self Parse] 在收到数据之前不会被调用的任何提示?

4

1 回答 1

1

你不能以你想要的方式做到这一点。从异步操作/方法/函数同步返回是不可能的(或者至少没有意义)。

您必须继承异步的、基于事件的模型,即不要尝试返回解析的数据,而是让调用者传入您从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”,这种命名约定意味着完全不同的用法。

于 2013-10-27T13:57:46.510 回答