Daljeet
Daljeet

Reputation: 1595

How Can i implement Offline caching of JSON?

I’m building an article reading app like TechCrunch.I’m fetching data from server that is JSON content and display JSON content in UITableView like Article image,title and author name.

When user click on an article it opens in UIWebView.

I have passéd the Title,author name and content of article through segue which i have already fetched in UITableView.

I have integrated third party library in my project that is AFNetworking.I want to implement offline caching of articles means if there is no internet user can read articles.

This my code:

TableView.m

              - (void)viewDidLoad
             {
                [super viewDidLoad];
                tempJson = [[NSMutableArray alloc] init];
                [self.tableView reloadData];
                NSString *jsonLink=[NSString stringWithFormat:@“www.example.com&page=1"];
                NSURL *url = [[NSURL alloc] initWithString:jsonLink];
                NSURLRequest *request = [NSURLRequest requestWithURL:url];
                AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
                operation.responseSerializer = [AFJSONResponseSerializer serializer];
                [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
                 NSArray *jsonArray = (NSArray *)responseObject;
                 for (NSDictionary *dic in jsonArray) {
                Json *json = [[Json alloc] initWithDictionary:dic];
                [tempJson addObject:json];
                   }
                self.jsons = [[NSArray alloc] initWithArray:tempJson];
                [self.tableView reloadData];
               } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                             message:[error localizedDescription]
                                                   delegate:nil
                                                   cancelButtonTitle:@"Ok"
                                                   otherButtonTitles:nil];
                                                   [alertView show];

                                             }];
                                           [operation start];
                               [self.tableView addInfiniteScrollingWithActionHandler:^{
                                   }];
                                 }

                -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
                  {
                     if ([[segue identifier] isEqualToString:@"ShowDetails1"]) {
                     Webview *ysdetailviewcontroller = [segue destinationViewController];
                     NSIndexPath *myindexpath1 = [self.tableView indexPathForSelectedRow];
                     long row1 = [myindexpath1 row];
           dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                     ysdetailviewcontroller.DetailModal1 = @[[self.jsons[row1] title],          [self.jsons[row1] author],[self.jsons[row1] a_image],[self.jsons[row1] content], [self.jsons[row1] link],[self.jsons[row1] date]];
                         });
                       } 
                      }

Webview.m

                - (void)viewDidLoad
                     {
                  [super viewDidLoad];
                  NSString *Title=[NSString stringWithFormat:@"<div style=\"line-height:80px;font-size:70px;font-family: Helvetica, Arial, Sans-Serif;font-weight:600;padding-left:40px; !important;padding-right:40px; !important;\">%@</div>",  _DetailModal1[0]];
                  NSString *AuthorName=[NSString stringWithFormat:@"<div><div style=\"color:#9E9E9E;line-height:70px;font-size:35px;font-family: Helvetica, Arial, Sans-Serif;font-weight:800;float:left;float:left;text-align:left;padding-left:40px; !important;\">%@&nbsp&nbsp</div>",_DetailModal1[1]];
                  NSString *Date=[NSString stringWithFormat:@"<div style=\"line-height:70px;font-size:35px;font-family: Helvetica, Arial, Sans-Serif;font-weight:200;\">%@</div></div><br><br>",_DetailModal1[5]];
                  NSString *url=[[NSString alloc] initWithString:_DetailModal1[3] ];//_DetailModal1[3] contains article content
                  NSString *javaScriptStar=@"<!DOCTYPE html><html><head><body></head><div style = \"line-height:70px !important;font-size:52px !important;font-family: Helvetica, Arial, Sans-Serif;font-weight:400;padding-left:40px; !important;padding-right:40px; !important;\">";
                  NSString *javaScriptEnd=@"</font></div></body></html>";
                  NSString *javaScriptLink=@"<body link=\"#3366CC\”>";  
                  NSString *javaScriptDec=@"<style type=\"text/css\">a {text-decoration: none; font-weight:bold; }img {  display: block;margin-left: auto; margin-right: auto;margin-top: 8px;margin-bottom: 8px; width : 800px !important;height:auto;}</style>";
                  NSString* myURLString = [NSString stringWithFormat:@"%@%@%@%@%@%@%@%@",Title,AuthorName,Date, javaScriptDec, javaScriptLink,javaScriptStar,url,javaScriptEnd];
                  NSString *htmlString = [myURLString  stringByReplacingOccurrencesOfString:@"src=\"//" withString:@"src=\"https://"];
                 _webView.delegate = self;
                 [_webView loadHTMLString:htmlString baseURL:nil];
                  }

Upvotes: 0

Views: 579

Answers (2)

Kunal Balani
Kunal Balani

Reputation: 4789

You might want to have a look at NSURLCache. Since AFNetworking is built on top of NSURLConnection setting up cache in app delegate should do exactly what you are trying to do.

Upvotes: 1

jefflovejapan
jefflovejapan

Reputation: 2121

There are lots of ways to persist the data to disk: you could use Core Data or raw SQLite, for instance. For something this simple, it'd be easiest to just write the JSON strings to a file and read them back when you want to show the articles. Take a look at Apple's File System Programming Guide.

Upvotes: 1

Related Questions