2012-06-15 1 views
0

Я немного запутался в правильном способе реализации модели NSObject. Я создаю класс Book, который расскажет некоторые данные (NSString, UIImage и т. Д.), Но я храню данные на сервере. Должен ли я создать метод для Book как -(void)loadDataFromServerWithID:(NSString *)bookID тогда, когда я создаю Book так:Создание NSObject не уверен, где скачать

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

и в методе loadDataFromServer загрузить данные в формате JSON и назначить переменные экземпляра к объекту?

Я думал о многих способах, которыми я могу это сделать, но я не совсем уверен, что это эффективный/умный способ сделать это.

Спасибо за любую помощь.

ответ

1

Один из способов сделать это - иметь только 1 класс, ответственный за разговор с сервером, а затем метод в классе, называемый bookFromServerWithID:, который возвращает новый объект книги, готовый к работе. Другие варианты включают некоторую форму обратного вызова, чтобы избежать блокировки основного потока.

Чтобы выполнить асинхронную загрузку, вы должны создать метод, аналогичный [NSURLConnection sendAsynchronousRequest:queue:completionHandler:] и, вероятно, вызовите упомянутый метод где-нибудь в вашем загрузчике. При обратном вызове вы должны проанализировать данные из соединения и дать обратный вызов вашему методу объект Book.

Если вы еще не работали с очередями, то Concurrency Programming Guide является полезным (если немного длинным и подробным).

+0

вы можете мне точку в правильном направлении для выполнения обратного вызова, чтобы избежать блокировки основного потока? – mkral

+0

@mkral обновлено с дополнительной информацией об асинхронной загрузке. – cobbal

1

Как вы обрабатываете извлечение данных с сервера? Вы всегда должны делать асинхронные вызовы в своем приложении, чтобы не блокировать пользовательский интерфейс. Я рекомендую вам попробовать AFNetworking. Если ваш сервер отправит обратно JSON, он будет напрямую преобразован в NSDictionary.

Я хотел бы иметь метод инициализации в моих моделях, выглядит следующим образом:

- (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