如果我需要导入协议,如何避免导入周期?

时间:2015-07-29 07:46:31

标签: ios objective-c realm

在objective-C中,我创建了11个类,它们将RLMObject子类化以表示我的数据库模型。 到目前为止,我有一个问题用这个构建我的应用程序,因为如标题中所述,他们似乎没有看到对方。 另外:它们位于同一个文件夹中,#import不会出现任何问题。

作为一个示例,我想提供两个类 以下是Books的课程:

#import <Realm/Realm.h>
#import "Chapter.h"

@interface Book : RLMObject

@property NSInteger id;
@property NSString *name;
@property RLMArray<Chapter> *chapters;

@end

// This protocol enables typed collections. i.e.:
// RLMArray<Book>
RLM_ARRAY_TYPE(Book)

以下是我的章节课程:

#import <Realm/Realm.h>

@class Book;

@interface Chapter : RLMObject

@property NSInteger id;
@property NSString *name;
@property Book *book;

@end

// This protocol enables typed collections. i.e.:
// RLMArray<Chapter>
RLM_ARRAY_TYPE(Chapter)

在Book.h中,我得到:

  

无法找到&#39;章&#39;

的协议声明

有人有想法吗? 这绝对是某种进口圈子。但是我该如何解决呢? 如果没有必要,我想避免将所有模型类放在前缀头中。

编辑:@class导入帮助了章文件,但它没有在书籍文件中

2 个答案:

答案 0 :(得分:4)

您还可以为要在列表属性中使用的对象制作协议转发声明,如下所示:

#import <Realm/Realm.h>

@protocol Chapter;

@interface Book : RLMObject

@property NSInteger id;
@property NSString *name;
@property RLMArray<Chapter> *chapters;

@end

// This protocol enables typed collections. i.e.:
// RLMArray<Book>
RLM_ARRAY_TYPE(Book)

注意:您必须使用@class进行一对一关系,并使用@protocol进行一对多关系。

除此之外,我建议你的场景使用章节到书中的a backlink而不是属性。你的问题中有两个独立的属性,自动同步。

如果你没有正确地维护它,这可能导致类似的东西:

  

图书:

     
      
  • id:0,姓名:“Moby Dick”,章节:[第0章,第1章]
  •   
  • id:1,名称:“Swift编程语言”,章节:[第2章,第3章]
  •   
     

章节:

     
      
  • id:0,姓名:“Loomings。”,书:Book#0
  •   
  • id:1,名称:“The Carpet-Bag。”,书:Book#0
  •   
  • id:2,名称:“关于斯威夫特”,书:书#1
  •   
  • id:3,名称:“快速游览”,书:书#0
  •   

看看“Swift Tour”如何引用“Moby Dick”,而它显然是Swift书的第二章。您的模型目前允许这样做,但您可以通过某种方式对其进行定义,以防止此类方案完全存在。

带有反向链接的解决方案看起来像这样:

@interface Chapter : RLMObject

@property NSInteger id;
@property NSString *name;
@property (readonly) Book *book;

@end

@implementation Chapter
// Define "book" as the inverse relationship to Book.chapters
- (Book *)book {
    return [self linkingObjectsOfClass:@"Book" forProperty:@"chapters"].firstObject;
}
@end

答案 1 :(得分:1)

好的,我想出了办法:

我制作了一个头文件ModelProtocols.h,并将所有类型集合的协议添加到该文件中:

#ifndef Your_Project_ModelProtocols_h
#define Your_Project_ModelProtocols_h

@class Book;
@class Chapter;

// This protocol enables typed collections. i.e.:
// RLMArray<Book>
RLM_ARRAY_TYPE(Book)

// This protocol enables typed collections. i.e.:
// RLMArray<Chapter>
RLM_ARRAY_TYPE(Chapter)

#endif

有了这个文件设置后,我需要在我的模型类中导入它:

#import "ModelProtocols.h"

并且可以将@class用于其余的模型类。这构建得很好,我仍然要测试它,但它应该工作。