在AFNetworking中实现唯一性

时间:2013-06-17 22:43:38

标签: json design-patterns unique afnetworking

我正在努力为AFNetworking中的独特性设计一个好的架构。考虑这种情况,例如,用户可以拥有许多东西,并且每个东西都有一个对称的一对一关系,回到它自己的用户。

在登录时初始化用户的模式很清楚。从解析的数据中创建Thing对象的数组,并在User上设置它。 (见下文。)类似的“更新”方法是类似的。

**User.m:** 
- (id)initWithAttributes:(NSDictionary *)attributes {
    // snip. . . .        
    _userID = [[attributes valueForKeyPath:@"id"] integerValue];
    _username = [attributes valueForKeyPath:@"username"];
    _avatarImageURLString = [attributes valueForKeyPath:@"avatar_image.url"];

    NSArray *thingsData = [attributes valueForKeyPath:@"things"];
    NSMutableArray newThings = [NSMutableArray array];
    for (NSDictionary *aThing in thingsData) {
        Thing *thing = [[Thing alloc] initWithAttributes:aThing];
        [newThings addObject:thing];
    }

    self.things = [newThings copy];

    return self;
}

但是如何处理Things user属性,特别是当,例如,获取可能指向不同用户,某些已登录用户以及某些其他用户指针的大量事物时?

考虑AFNetworking项目中的示例代码:

**Thing.m**
- (id)initWithAttributes:(NSDictionary *)attributes {
    // Init, etc . . . .    
    _user = [[User alloc] initWithAttributes:[attributes valueForKeyPath:@"user"]];

    return self;
}

此代码会创建悬空的用户对象,显然不是可行的方法。最好的解决方案类似于EOF / CoreData所做的事情,根据需要在关联对象中出错,并根据ID维护数据库。我可以复制该功能,但这似乎是一个常见的用例,我希望它已经完成。

我不想仅仅为了这个功能而使用RestKit;这个应用程序太过分了。

对良好模式的任何建议?我错过了AFNetworking中的一些摇滚功能吗?

2 个答案:

答案 0 :(得分:1)

您可能对AFIncrementalStore感兴趣。它是一个NSIncrementalStore子类,它将核心数据链接到AFNetworking,它比RestKit更简单(虽然功能更少。)

或者,您可以处理重复的用户数据 - 您说它“显然不是要走的路”,但如果对象足够轻,它可能不会引人注目。这种方法的一个好处是您可以使用NSCoding / NSKeyedArchiver来缓存数据 - API比核心数据简单得多。

最后,如果你喜欢核心数据方法并想要AFIncrementalStore和RestKit之间的东西,请考虑Magical Record。我个人没有使用它,但它通常被很好地采用,并且有足够的示例代码将它与AFNetworking集成。

答案 1 :(得分:1)

答案和问题与网络无关。这是数据建模的问题。

我怀疑,您希望拥有一个连接到提供数据和其他服务的Web服务的应用程序。 (否则网络课程没有多大意义)

属性的“唯一性”属性将通过使用属性的唯一索引在数据库级别上定义。看起来,你所指的是一个“关系”,一个用户和Thing类型的其他一些对象之间的1:m关系。 Web服务框架通常有方便的方法,您可以在其详细信息中定义数据模型。

为了创建Web服务应用程序,您可以使用大量可用和免费框架之一。您可以在网上查看更多信息。

如果要在客户端本地保存服务器数据的子集,则可能只想将Core Data与Web服务结合使用。这要求您也熟悉如何使本地数据和服务器上的数据保持同步。除非您拥有只读数据 - 并且Core Data仅用作缓存,否则此任务将成为一项挑战。

我无法强调最后一句话:同步的复杂性经常被低估。在不理解背后的复杂理论的情况下,一种不健全和不经意的方法很可能会失败。