因为我不想劫持另一个线程,所以我提出了关于映射的问题。
我确信 Blake Waters 给出的答案可能是非常正确的,因为他是一个比我更聪明、更有经验的人,但对我来说,逻辑告诉我将映射放在每个模型中:如果你改变了模型中的某些内容,您只需滚动即可更改映射。
然后,在我的 AppDelegate 中,我将在我的每个模型中调用 initMappings (或任何您想调用的名称)。
因为我不想劫持另一个线程,所以我提出了关于映射的问题。
我确信 Blake Waters 给出的答案可能是非常正确的,因为他是一个比我更聪明、更有经验的人,但对我来说,逻辑告诉我将映射放在每个模型中:如果你改变了模型中的某些内容,您只需滚动即可更改映射。
然后,在我的 AppDelegate 中,我将在我的每个模型中调用 initMappings (或任何您想调用的名称)。
我也喜欢将映射与我的模型一起放置。我通过向每个模型添加一个类方法来做到这一点,这样我就可以随时随地获取映射。
+ (RKObjectMapping *)objectMapping
{
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[self class]];
[mapping mapKeyPath:@"Id" toAttribute:@"id"];
[mapping mapKeyPath:@"Subject" toAttribute:@"subject"];
[mapping mapKeyPath:@"Message" toAttribute:@"message"];
[mapping mapKeyPath:@"PostDate" toAttribute:@"postDateStr"];
[mapping mapKeyPath:@"StatusId" toAttribute:@"statusId"];
[mapping mapKeyPath:@"StatusDate" toAttribute:@"statusDateStr"];
mapping.setNilForMissingRelationships = YES;
return mapping;
}
我选择了创建类别的路线并将其放入其中。我已经在我的应用程序委托类而不是映射提供程序上创建了它。
我认为在模型中使用它的问题就像在另一个线程中描述的那样,如果你有关系,你最终可能会得到循环引用。
我相信以您的方式思考是很自然的,因为您可以更好地控制代码及其清洁度,所以它很有意义,但是您必须非常小心,正如许多人所说,循环引用的问题可能很大麻烦。
关于该问题的解决方案是,当您有一个 A 实体引用 B,而 B 引用 A 时,那么在两个实体之一中,您将不得不选择不直接映射实体,否则您将在循环中结束。
当您在同一范围内拥有所有内容时,定义循环引用变得不可能,因为您需要 B 的初始定义才能在 A 上添加它的引用,所以我刚才提到的解决方案是在这种方法上执行它的自然方式。
这取决于您和您的应用程序您想使用哪种方法,哪种方法更适合您和您的团队采用。您必须在可能的错误和更简洁的代码之间做出选择。