首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 9解析JSON的最佳方案

iOS 9解析JSON的最佳方案
EN

Stack Overflow用户
提问于 2015-12-15 05:09:48
回答 3查看 3K关注 0票数 4

当我需要解析提要JSON时,我总是使用这个解决方案。

https://stackoverflow.com/a/20077594/2829111

但是sendAsynchronousRequest现在已经不受欢迎了,我被困在了这段代码中

代码语言:javascript
复制
__block NSDictionary *json;    
[[session dataTaskWithURL:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        // handle response
        json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSLog(@"Async JSON: %@", json);
        [collectionView reloadData];
}] resume];

因此,reloadData参数需要很长时间才能执行。我已经尝试过用以下方法强制返回主队列:

代码语言:javascript
复制
__block NSDictionary *json;    
[[session dataTaskWithURL:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
            // handle response
            json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
            NSLog(@"Async JSON: %@", json);
            dispatch_sync(dispatch_queue_create("com.foo.samplequeue", NULL), ^{[collectionView reloadData});
}] resume];
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-15 05:40:19

问题是,完成处理程序没有在主队列上运行。但是所有UI更新都必须发生在主队列上。所以把它分派到主队列:

代码语言:javascript
复制
[[session dataTaskWithURL:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    // handle response
    NSError *parseError;
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
    // do something with `json`
    dispatch_async(dispatch_get_main_queue()), ^{[collectionView reloadData]});
}] resume];
票数 1
EN

Stack Overflow用户

发布于 2015-12-15 05:30:42

你为什么不试试JSONModel图书馆呢.它是如此简单的使用

代码语言:javascript
复制
-(void)getEmployeePerformance:(EmpPerformanceRequest*)request
              withSuccesBlock:(succesEmployeePerformanceResponseBlock) successBlock
                 andFailBlock:(FailResponseBlock) failBlock
{       
    NSString* weatherUrl    = [[ABWebServiceUtil sharedInstance]getEmployeePerformanceURL];
    [HTTPClientUtil postDataToWS:weatherUrl parameters:[request toDictionary] WithHeaderDict:nil withBlock:^(AFHTTPRequestOperation *responseObj, NSError *error)
     {

        if(responseObj.response.statusCode == HTTP_RESPONSE_SUCESS)
        {
            EmpPerformanceArrayModel *empPerfArrModel;
           if(responseObj.responseString)
           {
               empPerfArrModel                  = [[EmpPerformanceArrayModel alloc]initWithString:result error:nil];
               empPerfArrModel.employeesArray   = [empPerformanceModel arrayOfModelsFromDictionaries:empPerfArrModel.employeesArray];
           }
            if(successBlock)
            {
                successBlock(responseObj.response.statusCode, empPerfArrModel);
            }
        }else if (failBlock)
        {
            failBlock(responseObj.response.statusCode);
        }
     }];
}

想了解更多细节,请点击这个链接.它会很好地向你介绍的

https://github.com/icanzilb/JSONModel

票数 0
EN

Stack Overflow用户

发布于 2015-12-15 05:19:57

尝试在connectionDidFinishLoading中解析JSON,这样您将得到作为NSDictionary的响应。

代码语言:javascript
复制
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
Class NSJSONSerializationclass = NSClassFromString(@"NSJSONSerialization");
    NSDictionary *result;
    NSError *error;

    if (NSJSONSerializationclass)
    {
        result = [NSJSONSerialization JSONObjectWithData: responseData options: NSJSONReadingMutableContainers error: &error];
    }

    // If the webservice response having values we have to call the completionBlock…
    if (result)
    {
        if (self.completionBlock != nil)
        {
            self.completionBlock(result);
        }
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34281531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档