2012-06-15 25 views
0

我在實現一個NSObject的模型正確的方式有點困惑。我創建了一個Book類,它將講述一些數據(NSString,UIImage等),但我將數據存儲在服務器上。我應該爲Book-(void)loadDataFromServerWithID:(NSString *)bookID隨後的方法,當我創建一個Book這樣的:創建NSObject的不知道從哪裏下載

Book *book = [Book alloc] init]; 
[book loadDataFromServerWithID:@"1234"]; 

和loadDataFromServer方法中下載JSON數據並分配實例變量的對象?

我一直在思考的很多方面我可以做到這一點,但我真的不知道反正是做有效的/聰明的方法。

感謝您的任何幫助。

回答

1

這樣做的一種方法是隻有一個類負責與服務器交談,然後在類中調用一個名爲bookFromServerWithID:的方法,該方法返回一個新的圖書對象。其他變體包括某種形式的回調以避免阻塞主線程。

要做到異步加載,你會創建一個類似於[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]的方法和可能會某處調用提到的方法在你的裝載機。在回調中,您將解析來自連接的數據,並將回調函數傳遞給您的方法Book對象。

如果您還沒有與隊列之前的工作中,Concurrency Programming Guide是有幫助的(如果稍有長期和深入的)讀取。

+0

你可以點我在正確的方向做一個回調以避免阻塞主線程? – mkral

+0

@mkral更新了一些關於異步加載的更多信息。 – cobbal

1

你是如何處理的數據從服務器檢索?您應該始終在您的應用中進行異步調用,以免阻止用戶界面。我鼓勵你試試AFNetworking。如果你的服務器發回JSON,它會直接轉換成一個NSDictionary。

我喜歡在我的模型的init方法看起來像這樣:

- (id)initWithDictionary:(NSDictionary *)dictionary 
{ 
    self = [super init]; 

    if (self) { 
     self.title = [dictionary objectForKey:@"title"]; 
     self.nbOfPages = [dictionary objectForKey:@"nbOfPages"]; 
     // etc. 
    } 

    return self; 
} 

當參數是你一旦JSON已經被解析字典。

本Scheirman made a screencast約AFNetworking他解釋究竟是如何做到這一點,你應該看看

+0

我剛開始使用AFNetworking並非常喜歡它。在成功塊中你會調用這個initWithDictionary嗎? – mkral

+1

確切的說,這就是你應該稱之爲的地方。如果你的調用讓你返回一本書的JSON,你的成功塊中的響應對象應該是你用我描述的方法實例化你的Book對象所需的字典。 – DrMonkey68