API块消息错误

时间:2013-10-15 22:13:57

标签: objective-c api objective-c-blocks

尝试发送以下消息

- (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值?

3 个答案:

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

startNSNumber,不是块。或者messageWithCompletionBlock:名字很糟糕......

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

你的方法希望返回一个数组,你希望能够从一个数据块中做到这一点 - 你错了。您需要更改您的设计,以便该方法不返回数组(可能它调用一个块作为参数传递)或者它以不同的方式获取数组。