创建NSObject不确定下载的位置

时间:2012-06-15 20:29:20

标签: ios model-view-controller nsobject

我对实现NSObject模型的正确方法感到有些困惑。我正在创建一个Book类来记录一些数据(NSString,UIImage等),但我将数据存储在服务器上。我是否应该为Book -(void)loadDataFromServerWithID:(NSString *)bookID创建方法,然后在创建Book这样的时候:

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

并在loadDataFromServer方法中下载JSON数据并将实例变量分配给对象?

我一直在想我可以通过很多方式做到这一点,但我不确定无论如何都是有效/聪明的方法。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是只有一个类负责与服务器通信,然后在类中使用一个名为bookFromServerWithID:的方法,该方法返回一个准备好的新书对象。其他变体包括某种形式的回调以避免阻塞主线程。

要进行异步加载,您可以创建一个类似于[NSURLConnection sendAsynchronousRequest:queue:completionHandler:]的方法,并且可能会在您的加载器中的某处调用所提到的方法。在回调中,您将解析连接中的数据,并将方法回调给Book对象。

如果您以前没有使用过队列,那么Concurrency Programming Guide是一个有用的(如果稍长且深入)阅读。

答案 1 :(得分:1)

如何处理从服务器检索数据?您应始终在应用程序中进行异步调用,以免阻止UI。我鼓励你尝试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后获得的字典。

Ben Scheirman made a screencast关于AFNetworking,他解释了如何完成这项工作,你应该看看