2017-06-14 55 views
-1

在我更新Core Data存儲庫後 - 通過刪除然後添加數據 - 在不同的線程中,我需要更改屏幕,然後返回數據以更新它。有沒有辦法更新核心數據,而無需更改應用程序中的屏幕?更新核心數據而不必更改屏幕

碼重置數據庫:運行時UI改變

- (void) resetDatabase { 
    count++; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){ 
     ConDAO *con = [[ConDAO alloc] init]; 
     DatabaseManager *manager = [DatabaseManager sharedManager]; 
     NSError * error; 
     NSURL * storeURL = [[[manager managedObjectContext] persistentStoreCoordinator] URLForPersistentStore:[[[[manager managedObjectContext] persistentStoreCoordinator] persistentStores] lastObject]]; 
     [[manager managedObjectContext] reset];//to drop pending changes 
     if ([[[manager managedObjectContext] persistentStoreCoordinator] removePersistentStore:[[[[manager managedObjectContext] persistentStoreCoordinator] persistentStores] lastObject] error:&error]) 
     { 
      // remove the file containing the data 
      [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]; 
      //recreate the store like in the appDelegate method 
      [[[manager managedObjectContext] persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];//recreates the persistent store 
     } 
     NSLog(@"*****************************"); 
     NSLog(@"updating"); 
     NSLog(@"count: %d", count); 
     NSLog(@"*****************************"); 

     [self populateDatabase:0 con:con]; 


     NSTimer *timer = [NSTimer timerWithTimeInterval:60.0 
               target:self 
               selector:@selector(resetDatabase) 
               userInfo:nil repeats:NO]; 
     [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
     dispatch_async(dispatch_get_main_queue(), ^(void){ 

       }); 
     }); 
} 

代碼:

- (void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 
    // Setup KVO for verifyingcard 
    [self addObserver:self forKeyPath:@"verifyingCard" options:NSKeyValueObservingOptionNew context:nil]; 

    if([BluetoothTech isEqualToString:@"BLE"]){ 
     self.centralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:@{CBCentralManagerOptionShowPowerAlertKey: @YES}]; 
    } 
    else if([BluetoothTech isEqualToString:@"HID"]){ 
     [self.bluetoothScanTextView becomeFirstResponder]; 
    } 
    [self loadStudents]; 
} 

我認爲它與loadStudents做()函數,但是當我使用NSNotificationCenter來從其他課程運行它,它仍然無法正常工作。

LoadStudent代碼:

- (void)loadStudents{ 
    NSError *error = nil; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Caf_student_cards"]; 
    NSArray *arr = [[self.manager managedObjectContext] executeFetchRequest:fetchRequest error:&error]; 
    for(int i = 0; i < [arr count]; i++){ 
     if([[[arr objectAtIndex:i] valueForKey:@"user_id"] isEqualToString:@"201509061"]){ 
      NSLog(@"%@",[arr objectAtIndex:i]); 
     } 
    } 
    if(!error){ 
     self.caf_student_cards = [NSMutableArray arrayWithArray:arr]; 
     self.keys = [[[arr.firstObject entity] attributesByName] allKeys]; 
    } 
    else{ 
     NSLog(@"%s %s %s","\n\n\n",[[error localizedDescription] UTF8String],"\n\n\n"); 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      // Show alert to tell user to reload this page 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[NSString stringWithFormat:@"Error: %@", [error localizedDescription]] message:@"Check connection and relog back into cafeteria." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; 
      [alert show]; 
     }); 
    } 
} 
+3

更新CoreData和更改UI之間的連接是什麼? –

+0

我不確定,但它只會更新當我更改UI屏幕 – King

+3

這怎麼可能花花公子?核心數據更新與UI更新沒有任何關係。請張貼一些代碼來澄清你的情況 –

回答

2

有多個問題與此代碼。

與你的問題最直接相關的是你正在更新你的持久性商店,但不更新你的UI。它不會自動發生。如果你有新的數據,你需要告訴你的用戶界面進行更新。如何做到這一點取決於你有什麼樣的用戶界面。如果它是一個表視圖,它可能就像告訴表視圖來重新加載它的數據一樣簡單。如果你有一個用來存儲用戶界面數據的數組,你也需要更新它(看起來這可能是你的代碼中的caf_student_cards,但是不可能確定)

其他問題 - 和這些都是你需要立即修正主要問題:。

  1. 你做核心數據的多線程錯誤使用dispatch_async是不是在這裏有效,您需要在您的管理對象上下文中使用performBlockperformBlockAndWait,要不然performBackgroundTask您的持久性容器上。
  2. 您正在刪除主持久性存儲文件,但未刪除日記文件。這非常有保證可以防止舊數據被刪除或者僅僅導致數據損壞。你在做什麼不是一種有用的技術。刪除持久性存儲文件很少是一個好主意。如果您想擺脫現有數據,請將其從Core Data中刪除,也許可以通過將您的上下文告知delete對象或使用NSBatchDeleteRequest

可能有其他的。這段代碼亂七八糟。如果你花一點時間瀏覽Apple的Core Data Programming Guide,你會爲自己做一件大好事。

還你keep問近same問題repeatedly。你有一些很好的建議,但你似乎沒有采取任何措施。如果您需要更多信息,請閱讀之前發佈此問題時人們已經提供的其他答案。

+0

謝謝,但在重新加載數組方面。我調用這個功能,但它仍然無法正常工作。當我輸入某個鍵時,它說它不存在,除非我改變屏幕。 – King

+2

然後你應該問一個問題,描述你如何更新你的用戶界面。即使它是你遇到的問題的核心,你仍然沒有描述甚至是一點點,也沒有包含解釋它的示例代碼。例如,你在這個問題中的代碼會加載一個數組,但根本不會觸及你的UI。 –

+0

我找到了錯誤發生的原因。所以基本上我的核心數據變成「數據:」,除非我改變屏幕。 – King