尝试发送以下消息
- (NSArray *)callSwaggerwithStart:(NSNumber *)start andCount:(NSNumber *)count { [api messageWithCompletionBlock:start count:count filter:@"image" completionHandler:^(CustomResponse *output, NSError *error) { if (!error) { return [NSArray arrayWithArray:[[output toDictionary] valueForKey:@"items"]]; } else { NSLog(@"ERROR IN CallApi, %@", &error); } }]; return nil; }
我收到以下错误:
Incompatible block pointer types
Control may reach end of non-void block
该块来自Api类,我想创建一个方法,因为它在一个控制器中多次使用。是什么让代码无法返回嵌套的NSArray值?
答案 0 :(得分:1)
-messageWithCompletionBlock:etc:
方法似乎是异步的,这意味着,正如它当前编写的那样,在-callSwaggerEtc:
返回后将调用该块。块内的“返回”从块返回,而不是从方法本身返回。您有两个选项 - 更改-callSwaggerEtc:
以获取自己的完成处理程序,或使用semaphore使其同步并且等待返回,直到块被调用。
答案 1 :(得分:1)
API完成块是异步执行的,因此您无法将其计算的任何内容同步返回给callSwaggerWithStart...
的调用者。 completionHandler可能比方法返回的时间晚得多。
一种有效的方法是使callSwaggerWithStart...
异步,如下所示:
- (void)callSwaggerwithStart:(NSNumber *)start andCount:(NSNumber *)count completionHandler:(void (^)(NSArray *result, NSError *error))completionHandler
{
[api messageWithCompletionBlock:start count:count filter:@"image" completionHandler:^(CustomResponse *output, NSError *error) {
if (completionHandler) {
if (!error) {
completionHandler([output toDictionary][@"items"]], error);
} else {
completionHandler(nil, error);
}
}
}];
}
答案 2 :(得分:0)
start
是NSNumber
,不是块。或者messageWithCompletionBlock:
名字很糟糕......
completionHandler
不期待回归。它也是一个块,所以从那里返回只是退出块,而不是包含方法。
你的方法希望返回一个数组,你希望能够从一个数据块中做到这一点 - 你错了。您需要更改您的设计,以便该方法不返回数组(可能它调用一个块作为参数传递)或者它以不同的方式获取数组。