我编写了一个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>
答案 0 :(得分:1)
如果您主要关注的是“取回”您的数据,那么您有三种方式(可能更多,但我只能使用这三种方式):
getData
方法中,您可以在调用NSNotification
之前发布您的viewController订阅的getData
getData
方法(带或不带结果)。这正是您在示例中构建AFJSONRequestOperation
时正在执行的操作。答案 1 :(得分:0)
您获得的错误是正确的。该块不应该返回任何内容,而return _jsonDictionary;
正在尝试返回该内容。
您需要做的是在成功块内更新_jsonDictionary
(就像您已经做的那样),然后调用另一个函数来启动刷新UI的事件(类似于调用[self.tableView refreshData]
)。
答案 2 :(得分:0)
你完全混合asyn和sync ...有效的没有_jsonDictionary,getData可以返回。只有在调用完成块时才会异步填充_jsonDictionary。
你需要从那里开始....例如调用另一种方法
至于你看到的错误/警告... getData应该返回一些东西(NSDictionary *)或一个void *(几乎是一个id的id)
不归还东西,只是无效。