0

我正在尝试为 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;
}

但是如何处理 Thingsuser属性,尤其是当获取大量可能具有指向不同用户、一些登录用户和一些其他用户的指针的事物时?

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

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

    return self;
}

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

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

对好的模式有什么建议吗?我是否缺少 AFNetworking 中的一些摇滚功能?

4

2 回答 2

1

您可能对AFIncrementalStore感兴趣。它是一个NSIncrementalStore子类,将 Core Data 链接到 AFNetworking,它比RestKit简单得多(尽管功能更少。)

或者,您可以处理重复的用户数据 - 您说这“显然不是要走的路”,但如果对象足够轻量级,它可能不会对性能造成明显影响。这种方法的一个好处是您可以使用NSCoding / NSKeyedArchiver来缓存数据——API 比 Core Data 简单得多。

最后,如果您喜欢 Core Data 方法并且想要介于 AFIncrementalStore 和 RestKit 之间的东西,请考虑使用Magical Record。我没有亲自使用过它,但它通常被很好地采用,并且有足够的示例代码可以将它与 AFNetworking 集成。

于 2013-06-18T11:49:54.050 回答
1

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

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

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

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

如果您想在客户端本地保存服务器数据的子集,您可能只想将 Core Data 与 Web 服务结合使用。这要求您也很清楚如何使本地数据和服务器上的数据保持同步。除非你有只读数据——而且 Core Data 只是作为缓存工作,否则这项任务将成为一个相当大的挑战。

最后一句话我怎么强调都不为过:同步的复杂性经常被低估。不了解背后复杂理论的不健全和粗心的方法很可能会失败。

于 2013-06-18T12:29:36.917 回答