有使用AFNetworking抓取JSON问题(Having problems using AFNe

2019-10-21 08:51发布

所以我最近想使用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];

}

Answer 1:

  1. 您正在设置acceptableContentTypestext/html 。 我相信你正在做的,因为你的网络服务没有设置正确Content-Type头,以表明它是application/json 。 如果固定网络服务提供正确的标头Content-Type ,然后你可以删除这个acceptableContentTypes在您的Objective-C代码行。

    如果你想知道为什么你不担心与NSURLConnection ,那是因为NSURLConnection没有做任何的验证Content-Type (除非,当然,你在编写自己的代码,例如, didReceiveResponse ,那检查这一点)。

  2. 你认为你是无法显示的数据。 但尚未有它,在你的第二个屏幕快照。 我个人会比左右我是否可以从访问数据内部表现那么担心NSDictionary 。 如果你

     NSLog(@"responseObject=%@", responseObject); 

    在#3,成功的块中,你看到正是? 我打赌你会看到你NSDictionary罚款(尽管在内部表示的细微差别)。

    我的观点是,你回来了成功获取数据。 是的,您的Web服务应设置正确Content-Type头,所以你不必覆盖acceptableContentTypes值,但它看起来像AFNetworking被检索数据的罚款。

  3. 可能的问题是,你的主线程试图使用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需要返回的数据,您可以重复此方法完成此块模式,太。



文章来源: Having problems using AFNetworking fetching JSON