1

我是 IOS Xcode 编程的新手。目前我正在开发一个使用 Json 数据的应用程序。该应用程序读取可能非常大的 Json 数据。我需要解析数据并将其存储到 Core Data 中,这样当应用程序下次运行时,它可以简单地从那里读取数据,从而节省大量时间。我尝试过使用dispatch_async,但 UI 似乎在保存数据时被冻结,这也导致应用程序崩溃。我曾经ASIHTTPRequest读取和解析 Json 数据,它工作得很好,但它是我必须将数据保存到核心数据并UITableView同时加载它的部分,这被证明是痛苦的。如果有人可以帮助我,我将不胜感激。

这是我的代码

NSString *connectionString = [NSString stringWithFormat:@"%@%@?song_id=%@", SERVER_STRING, URL_GET_SONG_LIST, lasSongID];

NSLog(@"COnnection String is:\n%@", connectionString);
NSURL* url = [NSURL URLWithString:connectionString];

//The actual request
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

// Becoming the request delegate
//To get callbacks like requestFinished: or requestFailed:
[request setDelegate:self];
NSLog(@"Fetching Dataaaaaaaa from %@",url);

// Fire off the request
[request startAsynchronous];

-(void) requestFinished: (ASIHTTPRequest *) request 
{
    NSString *theJSON = [request responseString];
    NSLog(@"Dataaaaaaaa,%@",theJSON);
    NSDictionary *responseDictionary = [theJSON JSONValue];

    if ([[responseDictionary valueForKey:@"Message"] isKindOfClass:[NSArray class]])
    {
        [songsArray addObjectsFromArray:[responseDictionary valueForKey:@"Message"]];

        if (songsArray.count > 0) 
        {
            dispatch_async (bgQueue, ^(void){
                [self saveDownloadedSongs];            
            });
        }
    }
}

saveDownloadedSongs--> 在经过一些验证后将 Json 保存到我的核心数据中

4

1 回答 1

0
  1. 为您要存储的实体创建一个 NSFetchedResultsController

    @property (nonatomic) NSFetchedResultsController fetchedResultsController;
    //Initialize it in your viewDidLoad
    
  2. 你的视图控制器应该是你的 NSFetchedResultsControllerDelegate
  3. 为 NSFetchedResultsController 实现委托方法

    - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
    {
        [self.tableView reloadData];
    }
    
  4. 为 UITableView 实现数据源方法

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return self.fetchedResultsController.sections.count;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [self.fetchedResultsController.sections[0] numberOfObjects];
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
    
        SomeObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
        cell.label.text = object.property
        return cell;
    }
    
  5. 每次持久化一个新对象时,您的委托将自动触发并重新加载表,该表现在包含新对象。

编辑:

如果您想节省时间,请创建一个新的主从应用程序。在您的 MasterViewController 中,您将找到步骤 1 的源代码和步骤 3 中的平滑动画。

于 2013-03-25T12:20:22.937 回答