子类化PFObject:正确的方法来覆盖动态getter?

时间:2014-04-17 08:25:52

标签: ios objective-c parse-platform

我使用PFObject的以下子类:

//HEADER FILE
#import <Parse/Parse.h>

@interface ParseMenuItem : PFObject <PFSubclassing>

@property (nonatomic, strong) NSString * name;
@property (nonatomic, strong) NSString * menuItemDescription;
@property (nonatomic, strong) NSArray * menuPortions; //Some other PFObjects...
@property (nonatomic, strong) NSArray * categories; //NSStrings

//...

@end


//IMPLEMENTATION FILE
#import <Parse/PFObject+Subclass.h>
#import "ParseMenuItem.h"
@implementation ParseMenuItem

@dynamic name, menuItemDescription, menuPortions, categories;

+ (NSString*) parseClassName {
    return @"MenuItem";
}

//...

@end

每当我尝试访问menuItem.categoriesmenuItem.menuPortions时,menuItemParseMenuItem类型的提取对象,就会引发异常Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Key "categories" / "menuPortions" has no data. Call fetchIfNeeded before getting its value.'

如何自定义这些属性的getter,以便在需要时自动获取数据?

我不知道动态生成的getter是怎么样的,所以我不知道我要写什么来替换它们一些自定义的。

有没有办法在我提供的那个中调用动态生成的那个?

1 个答案:

答案 0 :(得分:0)

在访问密钥之前,您需要先检查密钥以查看密钥是否已定义/有数据。让它在getter中获取数据是一个很好的想法,但它必须是异步的,所以它不能返回值,除非你提供了一个块。

你或许可以定义一个至少安全地检查而不会抛出的getter:

-(NSString *) menuItemDescription {
  if (menuItemDescription) {
    return menuItemDescription;
  }
  return nil;
}

编辑:您是否尝试过在setter中进行阻止获取?类似的东西:

-(NSArray *) categories {
  if (!categories) {
    [self fetchIfNeeded];
  }
  if (!categories) {
    return nil;
  }
  return categories;
}