2012-06-15 1 views
0

NSObject 모델을 구현하는 올바른 방법에 대해서는 약간 혼란 스럽습니다. 일부 데이터 (NSString, UIImage, 등) 이야기 할 Book 클래스를 만들고 있지만 서버에 데이터를 저장하고 있습니다. 어디서 다운로드해야할지 확실하지 않은 NSObject 만들기

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

과 loadDataFromServer 메소드 내

는 JSON 데이터를 다운로드하고 객체 인스턴스 변수를 할당 :이 같은 Book를 만들 때 나는 그 -(void)loadDataFromServerWithID:(NSString *)bookID 같은 Book하는 방법을 만들어야합니까?

나는 이것을 할 수있는 여러 가지 방법을 생각해 왔지만 어쨌든 그것을 할 수있는 효율적/현명한 방법이라고는 확신 할 수 없다.

도움 주셔서 감사합니다.

답변

1

이 작업을 수행하는 한 가지 방법은 서버와 통신하는 책임이있는 클래스를 1 개만 갖고 클래스에 bookFromServerWithID:과 같은 메서드가 있으면 새로운 책 객체를 반환 할 수 있습니다. 다른 변형에는 주 스레드를 막지 않도록 콜백 형식이 포함됩니다.

비동기 적재를 수행하려면 [NSURLConnection sendAsynchronousRequest:queue:completionHandler:]과 유사한 메소드를 작성하고 언급 된 메소드를 로더의 어딘가에서 호출해야합니다. 콜백에서 연결의 데이터를 구문 분석하고 메서드에 콜백을 Book 개체에 보냅니다.

이전에 대기열로 작업하지 않은 경우 Concurrency Programming Guide이 도움이됩니다 (약간 길고 심도있는 경우).

+0

당신이 올바른 방향으로 날 지점 수를 확인해야합니까? – mkral

+0

@mkral이 비동기 로딩에 대한 추가 정보로 업데이트되었습니다. – cobbal

1

서버에서 데이터 검색을 어떻게 처리합니까? UI를 차단하지 않으려면 항상 앱에서 비동기 호출을 만들어야합니다. AFNetworking을 시도해보십시오. 서버가 JSON을 다시 보내면 NSDictionary로 직접 변환됩니다. 매개 변수는 JSON 구문 분석 된 후에 당신이 얻을 사전입니다

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

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

    return self; 
} 

:

나는 다음과 같습니다 내 모델에서 init 메소드를 좋아합니다. 그가 어떻게이를 정확히 설명

벤 AFNetworking에 대한 Scheirman made a screencast, 당신은 메인 스레드를 차단하지 않도록하기 위해 콜백을 수행하기위한

+0

저는 AFNetworking을 사용하기 시작했으며 정말 좋아했습니다. 성공 블록에서이 initWithDictionary를 호출하겠습니까? – mkral

+1

그게 바로 당신이 부르기로되어있는 곳입니다. 귀하의 호출이 JSON을 하나의 서적으로 가져 오는 경우 성공 블록의 응답 객체는 앞서 설명한 방법으로 서적 객체를 인스턴스화하는 데 필요한 사전이어야합니다. – DrMonkey68