我在理解如何使用带有块的子类对象时遇到了麻烦。
这是我正在尝试的示例。 PFItem是PFObject的子类。
- (void) handleItem:(PFItem *)item{
[item fetchIfNeededInBackgroundWithBlock:^(PFItem *item, NSError *error) {
if (!error) {
if ([item.name isEqualToString:@"Antidote"]) {
NSLog(@"Applied %@", item.name);
NSMutableArray *discardItems = [NSMutableArray array];
for (PFItem *item in self.pfButtonCharacter.itemsApplied) {
if (item.malicious) {
[discardItems addObject:item];
NSLog(@"Removing %@", item.name);
}
}
[PFObject deleteAll:discardItems];
}
}
}];
}
但是,xcode将其标记为语义错误:
不兼容的块指针类型将'void(^)(PFItem * __ strong,NSError * __ strong)'发送到类型'PFObjectResultBlock'的参数(又名'void(^)(PFObject * __ strong,NSError * __ strong)')
如果我在fetchIfNeededInBackgroundWithBlock中从PFItem更改为PFObject,则可以使用,但是我将无法再访问item的属性。代替
item.name
,我需要做item[@"name"]
。 最佳答案
如果方法指定,则必须使用带有PFObject
参数而不是PFItem
参数的块,那么您必须使用与该方法匹配的块。
如果您知道要发送的对象实际上是PFItem
,则可以始终将其强制转换为该块:
[item fetchIfNeededInBackgroundWithBlock:^(PFObject *obj, NSError *error) {
PFItem *item;
if ([obj isKindOfClass:[PFItem class]]) {
item = (PFItem *)obj;
} else {
return;
}
if (!error) {
if ([item.name isEqualToString:@"Antidote"]) {
NSLog(@"Applied %@", item.name);
NSMutableArray *discardItems = [NSMutableArray array];
for (PFItem *item in self.pfButtonCharacter.itemsApplied) {
if (item.malicious) {
[discardItems addObject:item];
NSLog(@"Removing %@", item.name);
}
}
[PFObject deleteAll:discardItems];
}
}
}];
关于ios - 在诸如fetchIfNeededInBackgroundWithBlock之类的块中使用PFObject的子类时出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24589092/