无法从POST获取JSON - 不兼容的块指针类型

时间:2013-07-07 07:10:48

标签: ios objective-c afnetworking

我编写了一个POST方法,需要将jSON返回给调用她的viewcontroller。 如果我添加成功块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)'

我猜这是因为它是异步的,添加一个返回会强制它同步但是,我希望我的应用程序的所有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 ?? < / p>

3 个答案:

答案 0 :(得分:1)

如果您主要关注的是“取回”您的数据,那么您有三种方式(可能更多,但我只能使用这三种方式):

  1. 在您的getData方法中,您可以在调用NSNotification之前发布您的viewController订阅的getData
  2. 如果您正在使用(或计划使用)dataManager作为单例,则viewController可以在dataManager的@property上进行KVO
  3. 我的最爱:在你的调用viewController中,你构造并传递一个块到你将被调用的getData方法(带或不带结果)。这正是您在示例中构建AFJSONRequestOperation时正在执行的操作。

答案 1 :(得分:0)

您获得的错误是正确的。该块不应该返回任何内容,而return _jsonDictionary;正在尝试返回该内容。

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

答案 2 :(得分:0)

你完全混合asyn和sync ...有效的没有_jsonDictionary,getData可以返回。只有在调用完成块时才会异步填充_jsonDictionary。

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


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

不归还东西,只是无效。