2013-04-05 3 views
2

Я работаю над приложением IOS, написанным в Objective-C, и я почти сделали, за исключением одной вещи:Синтаксического JSON и сохранить локально

Я разбор JSON в Tableview, и я хочу для хранения данных локально в приложении. Но я не знаю, как это сделать. Каждая строка имеет изображение, заголовок, описание и ссылку. У меня разные вкладки с разными JSON.

(Я не хочу разбирать JSON каждый раз, когда приложение открывается, я хочу проверить, добавлено ли что-то новое в JSON, и THEN снова разобрать его. Но пока я просто счастлив, если я может удалять данные из JSON локально)

Я боролся с этим какое-то время, и мне действительно нужна помощь. Это последнее, что мне нужно исправить, прежде чем приложение будет готово для App Store.

Не знаю, нужно ли вам видеть какой-либо код, но я все равно отправляю его, чтобы вы могли лучше понять, что я делаю.

код для разбора JSON:

jsonData_ = [[NSMutableData alloc] init]; 
    NSString *urlString = [NSString stringWithFormat:@"http://www.myUrl.se/json/%@.json", _whatState]; 
    NSURL *url = [NSURL URLWithString: urlString]; 
    NSURLRequest *urlReq = [NSURLRequest requestWithURL: url]; 
    NSURLConnection *connection = [NSURLConnection connectionWithRequest: urlReq delegate:self]; 


-(void)connectionDidFinishLoading:(NSURLConnection*) connection{ 

    //NSLog(@"Succeeded! Recieved %d bytes of data", [jsonData_ length]); 
    NSError *error; 
    NSArray *items = [NSJSONSerialization JSONObjectWithData: jsonData_ options: kNilOptions error: &error]; 

    NSSortDescriptor *sortDesc = [[[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES]copy]; 
    NSMutableArray *sortedItems = [NSMutableArray arrayWithObject: sortDesc]; 
    sortedItems = [[items sortedArrayUsingDescriptors: sortedItems] copy]; 

    if(!error) 
    { 
     tableData_ = sortedItems; 
     tableImgs_ = [[NSMutableArray alloc] initWithArray: tableData_ copyItems: YES]; 
     [self.tableView reloadData]; 
     jsonIsFinishedLoading = TRUE; 

    } 
    else 
    { 
     NSLog(@"ERROR"); 
    } 
} 

Код для моего Tableview:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    static NSString *cellIdentifier = @"listItem"; 
    TSCustomCell *cell = (TSCustomCell*) [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 
    [cell setSelectedBackgroundView:selectedCellBgColorView]; 


    if(jsonIsFinishedLoading) 
    { 
     NSDictionary *row = [tableData_ objectAtIndex: indexPath.row]; 
     NSString *title = [row objectForKey:@"title"]; 

     cell.url = [row objectForKey:@"url"]; 
     UIFont *defaultFont = [UIFont fontWithName:@"Edmondsans-Bold" size:12.0]; 

     [cell.listItemLbl setText: title]; 
     [cell.listItemLbl setFont:defaultFont]; 


     if([[tableImgs_ objectAtIndex:indexPath.row] isMemberOfClass: [UIImage class]]) 
      { 
       [cell.listItemImage setImage: [tableImgs_ objectAtIndex: indexPath.row]]; 
      } 
      else 
      { 

       UIActivityIndicatorView *loadingSymbol = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleGray]; 
       loadingSymbol.frame = cell.listItemImage.frame; 
       [cell addSubview: loadingSymbol]; 
       [loadingSymbol startAnimating]; 


       dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul); 

       dispatch_async(queue, ^{ 


        NSString *url = [row objectForKey: @"image"]; 

        if([url isEqualToString: @""]) 
        { 
         url = @"http://www.myUrl.se/images/standard.png"; 
        } 
        else 
        { 
         url = [row objectForKey: @"image"]; 
        } 

        NSURL *imgUrl = [NSURL URLWithString: url]; 
        NSData *imageData = [NSData dataWithContentsOfURL: imgUrl]; 
        UIImage *image = [UIImage imageWithData: imageData]; 

        if(image != nil) 
        { 
         [tableImgs_ replaceObjectAtIndex:indexPath.row withObject:image]; 
         NSLog(@"tableImgs != nil"); 

        } 
        else 
        { 
         NSLog(@"tableImgs = nil"); 
         [cell.listItemImage setImage: [UIImage imageNamed:@"standard_transp.png"]]; 
        } 

        dispatch_sync(dispatch_get_main_queue(), ^{ 

         [loadingSymbol removeFromSuperview]; 
         [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation: UITableViewRowAnimationNone]; 


        }); 
       }); //end dispatch_async 
      } 
     } 
    } 


    return cell; 

} 

Спасибо !!

ответ

-3

Используйте AFNetworking, чтобы добиться этого. Его проще, быстрее и намного лучше, чем NSURLConnection.

Подробнее здесь: AFNetworking

+0

Будет ли AFNetworking помогать мне с моей проблемой для хранения данных локально? – Jojo

+0

Да, определенно !!. просто просмотрите статью –

1

Если я понял, вы исправите - вы можете сохранить ваши данные с JSon в пользовательские значения по умолчанию этого кода

[[NSUserDefaults standardUserDefaults] setObject:jsonData_ forKey:@"myData"]; 

Если разбор JSON - у вас есть данные с ним

, когда вы хотите получить его

jsonData_ = [[NSUserDefaults standardUserDefaults] valueForKey: @"myData"]; 
+0

Не хотите ли вы сохранять 'items' или' sortedItems', а не сырые данные? –

+0

Не имеет значения прямо сейчас. – Jojo

+0

Но дело в том, что у меня более одного json, с разными данными. Могу ли я сохранить несколько JSON в NSUserDefaults? – Jojo

-2

Here's a useful tutorial при использовании NSCoding Protocol и NSFileManager для сохранения объектов на диск. Если вы создадите объект для каждой строки, вы сможете их сохранить.

Вы также можете использовать этот подход для сохранения самого JSON, или можете сохранить его в user defaults.

# Saving 
[[NSUserDefaults standardUserDefaults] setObject:jsonData forKey:@"json data"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; // Generally happens automatically, but if this might happen close to backgrounding you'll want this 

# Loading 
jsonData = [[NSUserDefaults standardUserDefaults] objectForKey:@"json data"]; 
Смежные вопросы