Objective-c从异步NSURLConnection返回数据 - 用数据填充模型类

时间:2011-10-10 22:22:49

标签: objective-c asynchronous model nsurlconnection


我想要实现的是一个解析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方法中。
谢谢你的帮助。

1 个答案:

答案 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

但是如果你不想处理块,那么只需要一个委托模式,在这种模式中你的类拥有对你想要传回数据的类的引用。