2013-03-28 22 views
3

這是一個非常典型的場景,但我想知道最佳方法是什麼。iOS web api數據管理(singleton?)

假設我需要構建一個與REST API交互的應用程序。然後,來自Web服務器的數據在整個應用程序中以多種方式顯示。

通常,我處理這個問題的方式是讓一個單例處理所有的數據操作(從服務器獲取/存儲/存儲數據到內存中,然後當我想在tableview中顯示這些數據時因此,基本上

每當應用程序的一些部分需要通過訪問單訪問它這樣做數據

;,我會直接在數據源的方法訪問此單例如[[MyApi sharedInstance] arrayOfCustomObjects]。

這是一個很好的方法去解決這個問題嗎?有沒有其他模式可能更有用?

另一種方法是,不是將數據存儲在單例中,而是讓每個控制器都擁有實例變量來存儲它們所需的數據,然後使用單例只從服務器獲取數據,但自己存儲數據。這裏的問題是,如果控制器被過早解僱,那麼這個實例變量消失,服務器訪問被浪費(但這也許是件好事?)。

最後,當你堅持不懈地投入混合時,最好的策略是什麼?我想像有CoreData坐在網絡電話之間,其餘的應用程序將是一個很好的方法?

我想這裏真正的問題是什麼是管理來自服務器的數據的最佳方法,應該可能會被持續?

回答

2

這個問題有點寬泛,但我可以告訴你我通常的工作方式。

我通常有API客戶,單身,以這種方式

+ (instancetype)sharedAPI { 
    static dispatch_once_t once; 
    static id _sharedInstance; 
    dispatch_once(&once, ^{ 
     _sharedInstance = [[self alloc] init]; 
    }); 
    return _sharedInstance; 
} 

然後我用RestKitCoreData實體自動映射我的REST資源實現的。這種方法的好處在於,我不必手動處理持久性問題,但在每個API請求中,我都會關心這些問題。

我的API客戶端所做的只是提供包裝RestKit API的有用方法。

例如這是我獲取當前用戶的信息

- (void)getCurrentUserWithSuccess:(void (^)(HSUser *))success 
          failure:(void (^)(NSError *))failure { 
    NSString * path = [NSString stringWithFormat:HS_API_USER_PATH, [HSUser currentUser].userId; 
    [[RKObjectManager sharedManager] getObject:nil path:path parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
     HSUser * user = [mappingResult firstObject]; 
     if (success) { 
      success(user); 
     } 
    } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
     NSLog(@"%@", error); 
     if (failure) { 
      failure(error); 
     } 
    }]; 
} 

在我的控制器的邏輯API,然後我可以叫

[[HSAPI sharedAPI] getCurrentUserWithSuccess:^(HSUser * user) { 
    //do something 
} failure:^(NSError * error) { 
    //do something else 
}]; 

而且我剛纔說之前,這樣的API調用之後與當前用戶對應的HSUser實例會自動保留。

我覺得非常方便。

+0

感謝您的詳細回覆。你對RestKit有什麼經驗?我只是最近才聽到它,我想盡量減少第三方代碼的依賴。我發現它只在版本0.20。你覺得它有充分的文件記錄,支持好,穩定等?你有沒有遇到任何問題,讓你後悔在項目中使用它?謝謝! – nebs

+0

RestKit 0.20效果很好,並且非常一致。由於上一次版本升級引起的巨大變化,文檔中出現了一些問題,這些問題有時會過時。在第一次使用它時,我有些難以理解它的某些「自動」行爲,但我在幾天內完全理解了我需要的一切,從而達到了穩定的項目設置。另外,我不得不說,開發人員非常活躍,他很快回應了GitHub上的大部分問題,這絕對是一個專業人士。 –