我正在努力为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中的一些摇滚功能吗?
答案 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仅用作缓存,否则此任务将成为一项挑战。
我无法强调最后一句话:同步的复杂性经常被低估。在不理解背后的复杂理论的情况下,一种不健全和不经意的方法很可能会失败。