我在理解如何使用带有块的子类对象时遇到了麻烦。
这是我正在尝试的示例。 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/

10-10 01:40