我正在實現使用MagicalRecord和CoreData Wrapper的應用程序中的收藏場景。我正在尋找的價值,如果在我的實體中找到該屬性,它會刪除它作爲最喜歡的,否則它會將它添加到最喜歡的。在這裏做DX *foundDX = [DX MR_findFirstByAttribute:@"code" withValue:cell.DXCodeName.text];
foundDX是我正在檢查的值。
我有一個UISearchBar添加到我的tableView。所以當視圖被加載的時候,它會顯示已經使用過的最不喜歡的項目。如果用戶搜索並選擇一個項目,它會成功將它添加到fav併成功從數據模型中刪除它。但如果我再次點擊收藏按鈕,它會崩潰。被刪除的實體再次被findFirstByAttribute在MagicalRecord中找到
if (!foundDX.code) {
//If we are always getting into here that means that either foundDX is nil
//or the code is nil so you need to verify the logic around that.
if (indexPath != nil)
{
if (!_AddEditDX) {
self.AddEditDX = [DX MR_createEntity];
}
[self.AddEditDX setCode:cell.DXCodeName.text];
[self.AddEditDX setDescriptions:cell.DXDescText.text];
[self.AddEditDX setIsFav:[NSNumber numberWithInt:1]];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
[self.favDXArray addObject:self.AddEditDX];
[self fetchFavDX];
[cell.DXFavButton setImage:[UIImage imageNamed:@"star_filled"] forState:UIControlStateNormal];
[KSToastView ks_showToast:@"Added to Favourite" duration:1.0f];
}
} else if(self.favDXArray.count > indexPath.row) {
//You can get rid of the if(foundDX.code) because this is the else block to not having it so we must have it.
//Only thing to worry about is the array size
NSLog(@"count is: %ld and row is: %ld",_favDXArray.count, (long)indexPath.row);
DX *tempDX = [self.favDXArray objectAtIndex:indexPath.row];
[tempDX MR_deleteEntity];
[cell.DXFavButton setImage:[UIImage imageNamed:@"star_blank"] forState:UIControlStateNormal];
[self.favDXArray removeObjectAtIndex:indexPath.row];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
[KSToastView ks_showToast:@"Removed from Favourite" duration:1.0f];
}
通過應用一些斷點我發現:
假設代碼是E45
和foundDX
沒有發現它的第一次,並把它添加到數據模型。然後再次按下fav按鈕將其刪除,實際上刪除它。但如果我再次點擊收藏按鈕,foundDX仍然E45
,因此它崩潰。但是,如果我關閉應用程序並再次運行它,則E45
不再存在。
UPDATE
我已更新上面的代碼。我在viewDidLoad
中使用fetchFavDX
,所以我嘗試在上面的代碼中更新的方法中調用它。而在fetchFavDX
我這樣做:
-(void)fetchFavDX {
self.favDXArray = [NSMutableArray arrayWithArray:[DX MR_findAllSortedBy:@"code" ascending:YES]];
}
現在是前兩個時代意義添加/刪除/添加/刪除工作的罰款。之後,它只運行if (!foundDX.code)
塊,這意味着它沒有進入其他部分。
您是否可以使用崩潰日誌更新上述內容?請 – HarmVanRisk
@HarmVanRisk它的索引0超出了空數組的邊界,這表明對象被刪除,如果我再次運行應用程序,這是正確的。但是,如果它是相同的運行它崩潰與此錯誤。 –