0

试图发送以下消息

- (NSArray *)callSwaggerwithStart:(NSNumber *)start andCount:(NSNumber *)count
{
    [api messageWithCompletionBlock:start count:count filter:@"image" completionHandler:^(CustomResponse *output, NSError *error) {
        如果(!错误){
            return [NSArray arrayWithArray:[[output toDictionary] valueForKey:@"items"]];
        } 别的 {
            NSLog(@"CallApi 中的错误,%@", &error);
        }
    }];
    返回零;
}

我收到以下错误:

Incompatible block pointer types

Control may reach end of non-void block

该块来自 Api 类,我想创建一个方法,因为它在一个控制器中多次使用。是什么让代码无法返回嵌套的 NSArray 值?

4

3 回答 3

1

-messageWithCompletionBlock:etc:方法似乎是异步的,这意味着,正如当前编写的那样,该块将在-callSwaggerEtc:返回后被调用。块内的“返回”从块返回,而不是从方法本身返回。您有两个选择——更改-callSwaggerEtc:为采用自己的完成处理程序,或者使用信号量使其同步并等待返回,直到块被调用。

于 2013-10-15T22:17:31.927 回答
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);
            }
        }
    }];
}
于 2013-10-15T22:22:08.357 回答
0

start是一个NSNumber,而不是一个块。或者messageWithCompletionBlock:名字真的不好...

completionHandler不期望回报。它也是一个块,所以从那里返回只是退出块,而不是包含方法。

您的方法希望返回一个数组,您希望能够在一个块内执行此操作 - 你错了。您需要更改您的设计,以便该方法不返回数组(也许它调用一个块,它作为参数传递)或者它以不同的方式获取数组。

于 2013-10-15T22:20:19.980 回答