我想要实现的是一个解析json的类。我知道如何解析json,我通过委托让nsurlconnection工作
问题是,我想在该类中创建一个方法,它将从json返回那些已解析元素的NSArray。
我现在拥有的:
@interface JSONParser : NSObject {
NSMutableData *responseData;
NSString *url;
SBJsonParser *parser;
}
@property (nonatomic, retain) NSString *url;
@end
和
@implementation JSONParser
@synthesize url;
- (id)init
{
self = [super init];
if (self) {
responseData = [[NSMutableData data] retain];
parser = [[SBJsonParser alloc] init];
url = [[NSString alloc] init];
}
return self;
}
- (NSArray *) parse {
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[self url]]];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
[request release];
return ?;
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[connection release];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[responseData release];
NSMutableArray *results = [[NSMutableArray alloc] init];
//some parsing, filling the NSMutableArray
}
我想要实现的是解析方法以某种方式返回通过nsurlconnection生成的数组。当它生成时,我想将它返回到我创建的单例模型。
或者还有其他/更好的办法吗?
我基本上想用json中的数据填充我的模型。但问题是我会有一些不同的模型,我不能简单地指定一个保存在connectionDidFinishLoading方法中。
谢谢你的帮助。
答案 0 :(得分:1)
解析JSON数据有很多选项。提到了SBJSON。 JSONKit是另一个非常快的选择。它实际上并不比走遍解析器返回的NSArray和NSDictionary实例困难。
编辑: 我知道了;您想知道如何将异步进程的结果传递回创建该进程的任何对象。为什么不使用块?
为此定义完成块:
typedef void(^myJSONReturnBlock)(NSArray *jsonObjs);
和解析器类中的ivar:
@interface MYParserClass : NSObject
{
myJSONReturnBlock _completionHandler;
}
然后您的parse
方法将是这样的:
- (void)parseWithCompletionHandler:(myJSONReturnBlock)aHandler;
{
_completionHandler = Block_copy(aHandler);
// set up your asynchronous NSURLConnection here, etc
}
现在,您的委托方法需要以这种方式传递数组:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
{
// parse data to array of objects
if( _completionHandler )
_completionHandler(yourNSArrayInstance);
}
最后,您的调用类将要求解析器以这种方式解析:
[myParserClassInstance parseWithCompletionHandler:^(NSArray *jsonObjs)^{
// do something with the objects returned to you.
}];
此外,请不要忘记Block_release
dealloc
完成块ivar
但是如果你不想处理块,那么只需要一个委托模式,在这种模式中你的类拥有对你想要传回数据的类的引用。