2011-10-31 44 views
1

晚上好男人的解析,建筑方法HTTP通信和返回的JSON的iOS中

我的问题是更不是专门技术的工程/设计模式的办法。

我正在开发一个应用程序,它需要与返回JSON对象的远程API进行大量的交互。数据的检索,解析和使用不是问题,并且工作非常顺利。我希望为这种情况下的最佳设计方法获得一些指导。

我将解释什么我到目前为止(在伪代码和声明),看看如果你能帮助:

  1. 一个HTTP提取程序类实施必要的NSURLConnection的委托方法。我初始化,象这样的回调方法选择类返回给调用类上完成

    @implementation HTTPFetcher{ 
        - (id)initWithUrlRequest:(NSURLRequest *)aRequest receiver:(id)aReceiver action:(SEL)aReceiverAction 
        { 
        //set the member variables etc.. 
        } 
    
        //all NSURLConnection delegate methods 
    
        - (void)connectionDidFinishLoading... 
        { 
         [receiver performSelector:action withObject:self]; 
        } 
    } 
    
  2. 然后我有一个Singleton HTTPController类调用HTTPFetcher:

    - (void)postWithRequestString:(NSString *)aRequestString 
    { 
        [urlRequest setHTTPBody:[aRequestString dataUsingEncoding:NSUTF8StringEncoding]]; 
    
        fetcher = [[HTTPFetcher alloc]initWithUrlRequest:urlRequest receiver:self action:@selector(receivedDataFromService:)]; 
        [fetcher start]; 
    } 
    
    - (void)receivedDataFromService:(HTTPFetcher *)aFetcher{ 
        //handle the received data and split the parent object into an NSMutableDictionary 
    } 
    

现在这种方法非常适合应用程序,特别是我需要建模的独立实体(我基本上每个实体都有一个Singleton HTTPController)。

我的问题是在哪里处理JSON的自定义分析。目前,我在ViewController中解析需要数据的地方,但是这太靠近源,需要进一步提取,但我不确定如何。

我应该包括促进Singleton类内解析的方法还是应该创建更多控制器来解析操作?

我期待着您的回音

感谢

回答

1

我建议你建立在现有的JSON解析库上,尤其是John Engelhart的JSONKit,因为它可以说是iOS中性能最高的JSON解析库。根本不需要实现自定义的JSON解析,但是特别是可以节省实现代码的速度,这对您的需求来说太慢了,然后您需要对它进行迭代改进,直到其速度足够快以供您使用。

对于HTTP请求,我知道您已经实施了该行为,但您可能想要调查ASIHTTPRequestAFNetworking作为通用网络库,它们的声誉非常强大。注意AFNetworking使用上述JSONKit库进行JSON解析。


的方式ASIHTTPRequest(我在我的项目中使用该库)的工作原理是通过实施该协议ASIHTTPRequestDelegate,您创建一个URL的请求后,分配一个委托对象。有一个全球网络队列,它只是一个NSOperationQueue,它处理异步或多个并发活动请求。

您可以setDelegate:为对象开始检查你的委托是否已实施任何的不同点的方法,如由默认didReceiveData:requestDidFinish:,但你也可以设置自定义选择路径通过使用该方法来检查个人经营(setDidFinishSelector:@selector(downloadComplete:))。

你可以做什么时,例如didReceiveData:回调发生,是新接收的数据传递到存储在一个ASIJSONRequest的包装类的缓冲区(或使用AFNetworking,已经封装了这一点)。当缓冲区中有一个完整的JSON对象可以被正确解析时,您可以拨打JSONKit来做烦琐的工作,然后可以自己发送另一个回调给ASIJSONRequestDelegate以获取didReceiveData:,但现在数据已在一种可供您的应用程序的其余部分读取的格式。


另一种使用ASIHTTPRequest的方法是使用块。支持设置请求的完成块,接收数据时调用的块等。对于此设计模式,您甚至不需要包装类,只需将代码块设置为自己进行解析并返回解析到所需目标的任何新数据。

+0

感谢您的回复。 ASIHTTPRequest是一个非常好的电话 - 我在初次审查应用程序的构建时确实考虑过这一点,但客户端规格减少了它提供的任何好处。此外,客户不愿在任何可能的地方包含第三方库。很好的回答 - 谢谢你花时间。 – JordanMazurke

1

一种可能性将是视图或视图控制器提出一个模型对象,它需要(包括从远程服务器上的东西)的任何状态。 Model对象会被告知什么时候有来自服务器的任何新数据,然后它可以调用任何需要更新其内部状态(例如将plist或json转换为更规范的字典格式)所需的数据调用例程。