保存包含“计算”字段的PKTItem时是否存在避免错误的解决方法?

时间:2017-01-10 16:58:44

标签: objective-c swift xcode podio

如果PKTItem包含“计算”字段,save()将失败:

item["owner"] = myProfile
item.save()
.onSuccess {(savedItem : PKTItem!) in
    print("new owner is me: \(myProfile.name)")
}
.onError {error in
    print("Error: \(error.localizedDescription)")
}

结果为Error: Values cannot be set directly for field with id 126020899126020899是计算字段)。

但是,如果不存在“计算”字段,则代码按预期运行,并更新"owner"字段。

是否根本无法保存包含“计算”字段的项目?如果没有,我该怎么做呢?

[编辑]我真正需要的是一种保存对单个字段的更改而不是在整个save()实例上调用PKTitem的方法。这对我来说最有意义,因为我真的只需要更新一个字段。要清楚,我正在尝试更新的字段不是“计算”字段。我正在尝试更改的字段PKTProfile实例,它存在于PKTItem实例中,该实例还包含多个“计算”字段。如果由我决定,我将摆脱“计算”字段,但它们是我们工作流程的重要组成部分。

注意:我的示例基于PodioPlatformKit SDK中给出的示例。虽然PodioPlatformKit是折旧的,但这个药水在PodioKit中是相同的。我只使用它,因为它在Swift而不是Objective-C中给出了示例。等效的Objective-C示例是here.

1 个答案:

答案 0 :(得分:1)

我发现的解决方法非常简单。我更改了 PKTItem.m 文件中的save方法,如下所示:

- (PKTAsyncTask *)save {
  __block PKTAsyncTask *task = nil;

  PKTClient *client = [PKTClient currentClient];

  [client performBlock:^{
task = [[PKTApp fetchAppWithID:self.appID] pipe:^PKTAsyncTask *(PKTApp *app) {
  __block PKTAsyncTask *saveTask = nil;

  NSArray *itemFields = [self allFieldsToSaveForApp:app];

  // Filter out all fields of type PKTAppFieldTypeCalculation, which is the 'Calculation' type
  NSMutableArray *mutItemFields = [NSMutableArray new];
    for (PKTItemField* o in itemFields) {
        if ([o type] != PKTAppFieldTypeCalculation) {
            [mutItemFields addObject:o];
        }
    }
    NSArray *filteredItemFields = [mutItemFields copy];
  [client performBlock:^{
    saveTask = [self saveWithItemFields:filteredItemFields];
   }];

  return saveTask;
  }];
 }];
   return task;
 }