2011-10-31 30 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轉換爲更規範的字典格式)所需的數據調用例程。