我有一个名为MediaFile的PFObject子类。为了从对服务器的调用中获取我的子类的实例,我已经看到了如何从Parse子类中构造查询,如下所示:

PFQuery *query = [MediaFile query];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { ... }];

但是,我的应用程序中的大多数服务器调用都是自定义的Cloud调用,这些调用返回PFObjects。检索完这些对象后,我想将它们视为MediaFile对象,并对其调用MediaFile类中定义的自定义方法。投射不起作用,因为它实际上并未构造MediaFile对象。为了解决这个问题,我要做的是使用[MediaFile object]为每个PFObject构造一个新的MediaFiles,然后使用我写的一种称为loadFromObject:的方法将所有数据复制到每个PFObject中:
[PFCloud callFunctionInBackground:@"func" withParameters:@{} block:^(id objects, NSError *error) {

  for (PFObject *object in objects) {

    MediaFile *mf = [[MediaFile object] loadFromObject:object];

    [array addObject:mf];
  }
}];

在MediaFile.m中:
- (MediaFile *) loadFromObject:(PFObject *)object {
  NSArray *keys = [object allKeys];

  for (NSString *key in keys) {
    id obj = [object objectForKey:key];
    [self setObject:obj forKey:key];
  }

  return self;
}

这可行,但是有没有更优雅的方法来解决此问题?

最佳答案

您的自定义类如何定义?
因为它们的子类化机制依赖于键值编码(KVC)。
这是KVC Programming Guide。或者,您可以通过here查看指南。

以下示例应该起作用。

在标题中:

@interface CustomObject : PFObject <PFSubclassing>

@property (nonatomic, strong) NSString *propertyName;

在执行中:
#import <Parse/PFObject+Subclass.h>

#pragma mark - columns of Parse table
@dynamic propertyName;

#pragma mark - regiester parse subclass in runtime
+ (void)load {
    @autoreleasepool {
        [self registerSubclass];
    }
}

#pragma mark - parse cloud table name
+ (NSString *)parseClassName
{
    return @"CustomObject"; // table name
}

关于ios - 解析:将PFObject子类与PFCloud调用一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20158461/

10-11 02:43