我对NSURLConnectionDataDelegate有一个奇怪的问题。 我已经创建了一个用于解析json的类。 代码如下:
- (void)createJSONDictionaryFromURL:(NSURL *)url
{
NSURLRequest *request = [NSURLRequest requestWithURL:url];
(void)[[NSURLConnection alloc] initWithRequest:request delegate:self];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
jsonData = [[NSMutableData alloc] init];
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[jsonData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"Fail with error");
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
self.jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];
NSLog(@"%@", self.jsonDictionary);
}
在Method connectionDidFinishLoading中,一切正确,控制台显示正确的数据。 但我想在我的ViewController的viewDidLoad方法中使用它。
JSONParser *parser = [[JSONParser alloc] init];
NSDictionary *dict = [[NSDictionary alloc] init];
[parser createJSONDictionaryFromURL:url];
dict = parser.jsonDictionary;
NSLog(@"%@", dict);
控制台显示(null),任何人都可以帮助我吗?
抱歉我的英文不好
答案 0 :(得分:1)
由于网络连接(它是异步的),您的JSONParser
是异步的。因此,当您当前致电parser.jsonDictionary
时,您会发现数据尚未就绪。
您不希望在数据可用之前尝试阻止,而是应该设置回调以在数据准备就绪时将数据提供给视图控制器(这样您就可以保存并更新UI)。
可以通过向delegate
添加JSONParser
属性并让视图控制器自行分配并实现一些回调方法来完成。或者,使用较少的代码,JSONParser
可以提供视图控制器设置的块属性,并在connectionDidFinishLoading:
中调用(确保@property
使用(copy,nonatomic)`)。