【问题标题】:API block message errorsAPI 阻止消息错误
【发布时间】:2013-10-15 22:13:56
【问题描述】:

正在尝试发送以下消息

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

【问题讨论】:

  • 为什么callSwaggerwithStart...方法有返回值?处理直到方法返回很久之后才会返回数据的异步块时,这是没有意义的。您需要重新考虑它的工作原理。
  • 我已经添加了返回值,然后将其删除。谢谢!

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


【解决方案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);
            }
        }
    }];
}

【讨论】:

  • +1 很棒的@GP,很高兴看到这种模式来处理块的块
【解决方案2】:

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

【讨论】:

  • 哎呀,返回是个什么错误
【解决方案3】:

startNSNumber,而不是块。或者messageWithCompletionBlock:的名字真的很糟糕……

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

您的方法期望返回一个数组,而您期望能够在一个块中执行该操作——您错了。您需要更改您的设计,使该方法不返回一个数组(可能它调用一个块作为参数传递)或者它以不同的方式获取数组。

【讨论】:

  • 我强烈怀疑它的名字很糟糕。
猜你喜欢
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 2011-01-13
  • 2018-09-11
相关资源
最近更新 更多