不兼容的块指针类型?无法返回NSArray

时间:2015-02-24 02:58:55

标签: objective-c nsarray objective-c-blocks

我有一个块,我们在回调中返回一个数组。然后我创建另一个方法来存储该数组,如下所示:

- (NSArray *)getUserData{

[self fetchDataByUserId:self.userID completionHandler:^(NSArray *record) {
    return record;
}];
}

我收到了这种错误,所以请帮助我,我不明白。

"不兼容的块指针类型发送' NSArray *(^)(NSArray * __strong)到类型' void(^)的参数(NSArray * _strong)"

2 个答案:

答案 0 :(得分:2)

原因由@ user3386109解释,这是正确的方法。

- (void)getUserData:(void (^)(NSArray *record))complete {

    [self fetchDataByUserId:self.userID completionHandler:^(NSArray *record) {
        complete(record);
    }];

}

- (void)getUserData:(void (^)(NSArray *record))complete {

    [self fetchDataByUserId:self.userID completionHandler:complete];

}

此外,关于错误消息:"不兼容的块指针类型",你应该google"如何在objective-c"中使用Block,例如:http://rypress.com/tutorials/objective-c/blocks

由于您的completionHanler不是return type block,因此它是void阻止。

(void (^)(NSArray *record)) 与...不同 (NSArray * (^)(NSArray *record))

答案 1 :(得分:1)

不会立即调用completionHandler,并且不会返回值。您可以将completionHandler中的代码视为回调函数。调用者是一些框架代码,只要fetch完成就会执行。框架代码会调用您的completionHandler来告知您fetch已完成,并且不会期望任何返回值。

因此getUserData方法应该是一个startUserDataFetch方法,如果实际到达的话,您需要额外的代码来处理数据。