我无法理解如何使用带子块的子类对象。 这是我尝试的一个例子。 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"]
。
答案 0 :(得分:2)
如果方法指定必须使用带有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];
}
}
}];
答案 1 :(得分:1)
- (void) handleItem:(PFItem *)item{
[item fetchIfNeededInBackgroundWithBlock:^(PFObject *pfObj, NSError *error) {
PFItem *item = (PFItem *)pfObj;
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];
}
}
}];
}
将PFObject
投放到PFItem
,您就完成了。这假设PFObject
实际上是PFItem
。