如果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 126020899
(126020899
是计算字段)。
但是,如果不存在“计算”字段,则代码按预期运行,并更新"owner"
字段。
是否根本无法保存包含“计算”字段的项目?如果没有,我该怎么做呢?
[编辑]我真正需要的是一种保存对单个字段的更改而不是在整个save()
实例上调用PKTitem
的方法。这对我来说最有意义,因为我真的只需要更新一个字段。要清楚,我正在尝试更新的字段不是“计算”字段。我正在尝试更改的字段值是PKTProfile
实例,它存在于PKTItem
实例中,该实例还包含多个“计算”字段。如果由我决定,我将摆脱“计算”字段,但它们是我们工作流程的重要组成部分。
注意:我的示例基于PodioPlatformKit SDK中给出的示例。虽然PodioPlatformKit是折旧的,但这个药水在PodioKit中是相同的。我只使用它,因为它在Swift而不是Objective-C中给出了示例。等效的Objective-C示例是here.
答案 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;
}