2015-02-24 93 views
0

我有一个块,我们在回调中返回一个数组。然后我创建另一种方法来存储该阵列如下:不兼容的块指针类型?不能返回NSArray

- (NSArray *)getUserData{ 

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

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

“不兼容的块指针类型发送 '的NSArray *(^)(的NSArray * __strong)至类型的参数' 无效(^)(的NSArray * _strong)”

回答

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]; 

} 

此外,有关该错误信息: “不兼容的块指针”,你应该谷歌,前 “如何在Objective-C使用块”:http://rypress.com/tutorials/objective-c/blocks

因为您的completionHanler不是return type block,所以它是void区块。

(void (^)(NSArray *record))(NSArray * (^)(NSArray *record))

+0

谢谢你的解释,这是非常详细的。但是我应该怎么做才能有一个方法从这个获取中获取数据。一些如: - (NSArray *)userDataLoaded; – lionK 2015-02-24 05:27:41

+0

仅当您的fetchData方法可以返回NSArray而不是Block时。例如:NSArray * record = [self fetchDataByUserId];退货记录; – 2015-02-24 08:04:22

1

completionHandler不立即调用,而不是预计会返回一个价值。您可以将completionHandler中的代码视为回调函数。调用者是在fetch完成时执行的一些框架代码。框架代码调用您的completionHandler以通知您fetch已完成,并且不期望任何返回值。

因此,getUserData方法应该确实是一个startUserDataFetch方法,并且您需要额外的代码来处理数据,如果有的话/每当它实际到达时。

+0

谢谢你这么多的不同,我实际上是由你的答案更加了解块。每当我有足够的点数,我会投票给你:) – lionK 2015-02-24 05:46:28