所以我最近想使用NSURLConnection的到AFNetworking改变。 我可以AFNetworking奇怪的事情发生时,使用这两种方法的击打收到JSON数据。
这是怎么看起来像NSURLConnection的
这是怎么看起来像AFNetworking
我不知道这是什么(结构__lidb_autoregen_nspair)是,我不知道这是阻止我显示数据的东西
这是从AFNetworking的代码,我使用示例代码从射线
-(void) fetchData{
// 1
NSURL *url = [NSURL URLWithString:string];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 2
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
// 3
jsonDict = (NSMutableDictionary *)responseObject;
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 4
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather"
message:[error localizedDescription]
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alertView show];
}];
// 5
[operation start];
}
-------------------------------------------------- ---------------------------------------编辑
-(NSMutableDictionary *) getAllGames{
[self fetchData];
DataParser *dataParserObjec = [[DataParser alloc] init];
return [dataParserObjec sendBackAllGames:jsonDict];
}
您正在设置acceptableContentTypes
到text/html
。 我相信你正在做的,因为你的网络服务没有设置正确Content-Type
头,以表明它是application/json
。 如果固定网络服务提供正确的标头Content-Type
,然后你可以删除这个acceptableContentTypes
在您的Objective-C代码行。
如果你想知道为什么你不担心与NSURLConnection
,那是因为NSURLConnection
没有做任何的验证Content-Type
(除非,当然,你在编写自己的代码,例如, didReceiveResponse
,那检查这一点)。
你认为你是无法显示的数据。 但尚未有它,在你的第二个屏幕快照。 我个人会比左右我是否可以从访问数据内部表现那么担心NSDictionary
。 如果你
NSLog(@"responseObject=%@", responseObject);
在#3,成功的块中,你看到正是? 我打赌你会看到你NSDictionary
罚款(尽管在内部表示的细微差别)。
我的观点是,你回来了成功获取数据。 是的,您的Web服务应设置正确Content-Type
头,所以你不必覆盖acceptableContentTypes
值,但它看起来像AFNetworking被检索数据的罚款。
可能的问题是,你的主线程试图使用jsonDict
异步网络请求之前完成。 因此,关键是要推迟使用的jsonDict
直到异步请求完成。
你已经更新了你的问题向我们展示了,你实例化一个DataParser
并调用sendBackAllGames
。 你应该把这些代码,你的异步网络请求的完成块内 。
或者,你可以在你使用完成块状花纹fetchData
方法,然后getAllGames
方法可以提供sendBackAllGames
在完成分组码fetchData
的成功块内部调用AFHTTPRequestOperation
。
如果您使用的完成块模式,它会是什么样子
-(void) fetchDataWithCompletionHandler:(void (^)(id responseObject, NSError *error))completionHandler {
NSURL *url = [NSURL URLWithString:string];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
// removed once we fixed the `Content-Type` header on server
//
// operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
if (completionHandler) {
completionHandler(responseObject, nil);
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[[[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather"
message:[error localizedDescription]
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil] show];
if (completionHandler) {
completionHandler(nil, error);
}
}];
[operation start];
}
而且你会调用它像这样:
[self fetchDataWithCompletionHandler:^(id responseObject, NSError *error) {
if (responseObject) {
DataParser *dataParserObjec = [[DataParser alloc] init];
NSMutableDictionary *results = [dataParserObjec sendBackAllGames:jsonDict];
// do whatever you want with results
}
}];
如果调用的方法getAllGames
需要返回的数据,您可以重复此方法完成此块模式,太。