0

アプリでWCFサービスを利用しています。iPadでアプリを初めて実行するときに、WCFサービスを呼び出して結果をUITableViewに表示させたいです。UITableViewにデータを表示するとともに、データを保存したいです。 Core Data のデータなので、ユーザーが「オフライン」(Wi-Fi に接続されていない) の場合、データは Core Data から表示されます。AppDelegate.m は次のようになります。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
    if (![defaults objectForKey:@"firstRun"])
    {
        self.firstRun = TRUE;
        [defaults setObject:[NSDate date] forKey:@"firstRun"];
    }
    else
    {
       self.firstRun = FALSE;//flag does exist so this ISNT the first run
    }
   [[NSUserDefaults standardUserDefaults] synchronize];
}

UITableView のコードは次のようになります。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [my_table setDataSource:self];
    [my_table setDelegate:self];

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    if (appDelegate.firstRun){
        NSLog(@"IS FIRST RUN");
        EDViPadDocSyncService *service = [[EDViPadDocSyncService alloc]init];
        [service getAllCategories:self action:@selector(handleGetAllCategories:)];
    }
    else 
    {
        NSLog(@"NOT FIRST RUN");
        NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription
                                       entityForName:@"Categories" inManagedObjectContext:managedObjectContext];
        [fetchRequest setEntity:entity];
        NSError *errormsg;
        self.allCats = [managedObjectContext executeFetchRequest:fetchRequest error:&errormsg];
        NSLog(@"allCATS=%@",self.allCats);
        self.title = @"Categories";
    }
}

-(void)handleGetAllCategories:(id)value
{
    if([value isKindOfClass:[NSError class]])
    {
        NSLog(@"This is an error %@",value);
        return;
    }

    if([value isKindOfClass:[SoapFault class]])
    {
        NSLog(@"this is a soap fault %@",value);
        return;
    }
    NSMutableArray *result = (NSMutableArray*)value;

    NSMutableArray *categoryList = [[NSMutableArray alloc] init];
    NSMutableArray *docCount = [[NSMutableArray alloc]init];
    NSMutableArray *catIdList = [[NSMutableArray alloc]init];

    self.myData = [[NSMutableArray array] init];
    self.myDocCount = [[NSMutableArray array]init];
    self.catId = [[NSMutableArray array]init];

    for (int i = 0; i < [result count]; i++)
    {
        EDVCategory *catObj = [[EDVCategory alloc]init];
        catObj = [result objectAtIndex:i];
        [categoryList addObject:[catObj categoryName]];
        [docCount addObject:[NSNumber numberWithInt:[catObj docCount]]];
        [catIdList addObject:[NSNumber numberWithInt:[catObj categoryId]]];
    }

    self.myData = categoryList;
    self.myDocCount = docCount;
    self.catId = catIdList;
    [my_table reloadData];

    /*store data in Core Data - START*/
    NSManagedObjectContext *context = [self managedObjectContext];
    NSManagedObject *newCategory;
    for(int j=0;j<[result count];j++)
    {
        newCategory = [NSEntityDescription insertNewObjectForEntityForName:@"Categories" inManagedObjectContext:context];
        /*HOW TO STORE DATA FOR THE "CATEGORIES" OBJECT IN CORE DATA*/
    }
    /*store data in Core Data - END*/
}

wcf サービスから受信したデータをコア データ オブジェクトに直接保存する方法がわかりません。画面上のテキスト ボックスからコア データ オブジェクトにデータを保存する方法を知っています。例:-

coreDataAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSManagedObject *newContact;
newCat = [NSEntityDescription insertNewObjectForEntityForName:@"Categories" inManagedObjectContext:context];
[newCat setValue:name.text forKey:@"name"];
name.text = @"";
[context save:&error];

しかし、これは私の場合には役に立ちません。

4

2 に答える 2

0

ネットワークとUIコードを混在させています。これは、保守不可能なコードのレシピです。

UIはコアデータを確認し、そのデータを表示するにはコアデータのみを確認する必要があります。

これとは別に、非同期で、WCFにデータを要求し、それをCoreDataにプッシュする必要があります。

UIは、最初の実行と後続の実行を気にする必要はありません。を介してコアデータを確認するだけNSFetchedResultsControllerです。

ネットワークコードは、新規と更新を気にする唯一の部分です。

アップデート1

どうすればこれを達成できますか?アプリが実行されてWiFiに接続されている場合、WCFサービスから最新のデータを取得する必要があります。

NSURLConnection組み込みの非同期リクエストを実行できます。通常、ネットワークコードをNSOperationサブクラスとして記述し、それらをキューに入れることをお勧めします。

WCFはXMLを返すことができ、標準のHTTPリクエストを受け取るようです。したがってNSOperation、リクエストを作成するサブクラスを作成し、それをサーバーに送信して、応答を待つことができます。返信が来たら、XMLを解析してCoreDataに挿入します。Core Dataを保存するとNSManagedObjectContextNSFetchedResultsControllerインスタンスが自動的に起動し、UIを更新できるようになります。

XML応答ではなくJSON応答用に記述されていますが、これらの機能を実行するコードサンプルがいくつかあります。それらの例を取り上げて、ニーズに合わせて変更することは難しくありません。

このstackoverflowの質問とその応答から始めることができます。

于 2012-08-28T06:57:16.010 に答える
0

データを の属性に保存するには、NSManagedObjectKVC を使用して値を設定するだけです。

EDVCategory *catObject = [result objectAtIndex:j];
[newCategory setValue:[catObject categoryName] forKey@"categoryName"];
[newCategory setValue:[catObject docCount] forKey@"docCount"];    
[newCategory setValue:[catObject categoryID] forKey@"categoryID"];

// after the loop
[context save:&nil];
于 2012-08-28T06:52:36.727 に答える