在类型为'RKObjectManager'的对象上找不到属性'managedObjectStore'。

29

我一直在尝试使用Restkit库的0.20.3版本。最近出现了一个错误,我无法解决。它如下所示:

在类型为'RKObjectManager *'的对象上找不到属性'managedObjectStore'

这个问题发生在包含以下代码的行:

objectManager.managedObjectStore = managedObjectStore;

下面是我代码的一小部分,以帮助识别问题。我使用CocoaPods安装了所有必要的库,并且一切看起来都链接正确。

#import "AppDelegate.h"
#import <RestKit/RestKit.h>
#import <RestKit/CoreData.h>
#import <CoreData/CoreData.h>
#import <RestKit/ObjectMapping.h>
#import "Temperature.h"

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions
{

    //let AFNetworking manage the activity indicator
    [AFNetworkActivityIndicatorManager sharedManager].enabled = YES;

    // Override point for customization after application launch.
    RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://grid.no-ip.biz/grid"]];
    NSURL *modelURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"Grideye" ofType:@"momd"]];

    //Initialize managed object store
    NSManagedObjectModel *managedObjectModel = [[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL ] mutableCopy];
    RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];

    objectManager.managedObjectStore = managedObjectStore;

   // Setup our object mappings
   /**
   Mapping by entity. Here we are configuring a maping by targetting a Core Data entity with a specific
   name. This allows us to map back Sensor database objects directly onto NSManagedObject instances
   there is no backing model class
   */
   RKEntityMapping *sensorMapping = [RKEntityMapping mappingForEntityForName:@"SensorID" inManagedObjectStore:managedObjectStore];
   sensorMapping.identificationAttributes = @[ @"sensorID"];
   [sensorMapping addAttributeMappingsFromDictionary:@{
        @"sensorID" : @"sensorID",
        @"cellNum"  : @"cellNum",
        @"timeStamp": @"timeStamp",
        @"temp"     : @"temp"
        }];

   //Update date format so that we can parse Sensor dates properly
   [RKObjectMapping addDefaultDateFormatterForString:@"E MMM d HH:mm:ss Z y" inTimeZone:nil];

   // Register our mappings with the provider
   RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:sensorMapping method:RKRequestMethodGET pathPattern:@":grid" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

感谢您所提供的任何意见!


你从0.1x升级到0.20.3了吗?还有其他的编译错误/警告吗? - Wain
请将回答问题的答案标记为“已接受”。这不仅有助于花时间发布答案的人,还有助于SO社区。 - LJ Wilson
6个回答

73

当我从0.20.1升级到0.20.3时,我遇到了完全相同的问题。

你需要做的是在导入RestKit之前先导入CoreData。

#import <CoreData/CoreData.h>
#import <RestKit/RestKit.h>

正在工作。

但是

#import <RestKit/RestKit.h>
#import <CoreData/CoreData.h>

不能工作。


Tnq Tomusm,我已经花了两个小时查看代码的其他部分,这个错误很小,但对于编译器来说绝对是个大问题。学到了新东西。再次感谢。 - Dinakar
4
在Swift中,您需要按照上述顺序将其添加到项目的桥接标头中。 - Mark Horgan
我希望我能再次给这个点赞。它还应该被标记为被采纳的答案@Cale Spratt - LJ Wilson
哇...不错的捕捉。 - Siten

26
在构建设置中添加用户头文件搜索路径 "${PROJECT_DIR}/Pods",并勾选递归选项。这在我的情况下解决了问题。

1
已解决XCode 7.3(7D175)的问题。 - Morgan Wilde

4
在XCode6中创建新项目时,默认情况下不会创建“pch”文件,我不得不手动创建pch文件,按照Xcode 6中的PCH文件进行操作。
在pch文件中导入头文件后,我成功地解决了这个问题。
#import <CoreData/CoreData.h>
#import <RestKit/RestKit.h>

3

添加

#import <CoreData/CoreData.h>  

将内容添加到您的.pch文件中。


2
这个问题的根本原因在于RKObjectManager.h文件中。
#ifdef _COREDATADEFINES_H
#   if __has_include("RKCoreData.h")
#       define RKCoreDataIncluded
#   endif
#endif

这个include已更名为RestKit/CoreData.h,所以无论RKCoreData.h出现在哪里都要更改,有几个包含文件使用了这个结构,所以进行全局搜索。


由于这个条件定义语句,我在Swift中遇到了同样的问题。 - Aqib Mumtaz

0

如果您正在从0.20升级到0.26(比如升级一个多年未更新的旧项目),您可能会发现其他答案中建议的以下两点都不足以解决问题:

  • 在pch文件中添加#import <CoreData/CoreData.h>
  • #import <RestKit/RestKit.h>之前添加#import <CoreData/CoreData.h>

相反,应该在导入restkit的相关文件的顶部添加:

// Workaround for bug on RestKit 0.26.0 according to https://github.com/RestKit/RestKit/issues/2352
#ifndef RKCoreDataIncluded 
#define RKCoreDataIncluded 
#endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接