3

我编写了一个 POST 方法,该方法需要将一个 JSON 返回给调用她的视图控制器。如果我添加成功块return _jsonDictionary;,我将收到此错误:

Incompatible block pointer types sending 'id (^)(NSURLRequest *__strong, NSHTTPURLResponse *__strong, __strong id)' to parameter of type 'void (^)(NSURLRequest *__strong, NSHTTPURLResponse *__strong, __strong id)'

我猜是因为它是异步的,所以添加一个 return 将强制它同步,但是,我希望我的应用程序的所有 POST 方法都在一个类中,因此将数据从 JSON 中获取到在我的应用程序中声明的变量中使用的东西喜欢valueForKey让事情对我来说有点复杂。这是糟糕的设计吗?

    -(NSDictionary *)getData
    {   
        _jsonDictionary = [[NSDictionary alloc]init];
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/getSomething",MainURL ]];

        [AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"text/html"]];

        AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
        NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:nil parameters:nil];    

        AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
        success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
        {
            _jsonDictionary = JSON;

            NSLog(@"jsonDictionary: %@",_jsonDictionary);
        }
        failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON)
        {
            NSLog(@"request: %@",request);
            NSLog(@"Failed: %@",[error localizedDescription]);
        }];

        [httpClient enqueueHTTPRequestOperation:operation];
}

另一个问题,为什么我会在上面的代码末尾收到这个警告:Control reaches end of non-void function即使我将 .m 和 .h 中的方法名称更改为-(void )getData??

4

3 回答 3

1

如果您主要关心的是“取回”您的数据,那么您有三种方法(也许更多,但我只能做到这三种):

  1. 在您的getData方法中,您可以NSNotification在调用之前发布您的 viewController 订阅的getData
  2. 如果您正在使用(或计划使用)dataManager 作为单例,您的 viewController 可以在 dataManager 的 @property 上进行 KVO
  3. 我最喜欢的:在调用 viewController 中,构造一个块并将其传递给getData将被调用的方法(带或不带结果)。这正是您AFJSONRequestOperation在示例中构建时所做的。
于 2013-07-07T07:56:21.470 回答
0

你完全混合了异步和同步......没有有效的 _jsonDictionary getData 可以返回。_jsonDictionary 仅在调用完成块时异步填充。

你需要从那里继续......例如调用另一种方法


至于你看到的错误/警告...... getData 应该返回一些东西 (NSDictionary*) 或一个 void* (几乎等于一个 id)

不退回东西,它只是无效的。

于 2013-07-07T08:36:38.233 回答
0

你得到的错误是正确的。该块不应该返回任何东西,而您return _jsonDictionary;正在尝试这样做。

您需要做的是_jsonDictionary在成功块内更新(就像您已经做的那样),然后调用另一个函数来触发刷新 UI 的事件(例如调用[self.tableView refreshData])。

于 2013-07-07T07:37:53.583 回答