在诸如fetchIfNeededInBackgroundWithBlock之类的块中使用PFObject的子类时遇到麻烦

时间:2014-07-05 17:56:15

标签: ios objective-c parse-platform objective-c-blocks

我无法理解如何使用带子块的子类对象。 这是我尝试的一个例子。 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"]

2 个答案:

答案 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