Отношение CoreData не обновляется после вставки с использованием MagicalRecord

У меня есть приложение с двумя представлениями. Первый позволяет создать ряд сущностей в Core Data, а второй — отображать данные созданных сущностей.

В моих моделях данных CoreData у меня есть две сущности:

CD_AProduct и CD_AProductItems.

CD_AProduct содержит необязательную связь с именем productItems, которая является CD_AProductItems:

введите здесь описание изображения

CD_AProductItems содержит необязательную связь с именем product, ведь CD_AProduct

введите здесь описание изображения

В классе AppDelegate я создаю экземпляр Core Data Stack следующим образом:

MagicalRecord.setupAutoMigratingCoreDataStack()

Код первого просмотра

Затем в своем коде я впервые создаю четыре объекта CD_AProductItem и связываю отношения:

if let entity = CD_ProductItem.MR_createEntity() as? CD_ProductItem
{
    product.addProductItemsObject(entity)

    entity.product = product

    success()
}
else
{
    failure()
}

Затем я сохраняю объекты в постоянном хранилище:

NSManagedObjectContext.MR_defaultContext().MR_saveToPersistentStoreWithCompletion({(successBlock : Bool, error : NSError!) in

        if successBlock
        {
            success()
        }
        else
        {                            
            if error != nil
            {
                failure()
            }
            else
            {
                success()
            }
        }
    }
)

Код второго представления

// Product is retrieved with CD_AProduct.MR_findFirstByAttribute
for productItem in product.productItems
{
    println("productItem: \(productItem)")   
}

Теперь, что не так с этим.

  • Первый вид: пользователь «выбирает» 4 элемента продукта для добавления в продукт.
  • Нажмите на верхнюю правую кнопку моего представления, чтобы перейти к следующему представлению.
  • Второе представление: отображение данных о созданных 4 элементах продукта.
  • Вернитесь на первую страницу, используя верхнюю левую кнопку моего представления.
  • Первый просмотр: добавить еще 4 товарных позиции в мой товар
  • Перейти на следующую страницу
  • Второй вид: отображать только 4 товарных позиции вместо 8!

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

Любые предложения о том, что происходит и как я могу быть уверен, что весь основной стек данных был обновлен, прежде чем перейти ко второму представлению?


person Jean Lebrument    schedule 08.09.2014    source источник


Ответы (1)


Насколько я понимаю, вам нужны разные элементы в разных indexPath, поэтому в этом случае вы должны указать indexPath, который нужно найти, прежде чем перейти к следующему viewController. В данный момент вы загружаете все элементы, которые содержат product.productItems. Из-за того, что в вашем сообщении мало кода, давайте представим, что у вас есть UITableView в качестве первого контроллера.

Прежде всего вам нужно создать массив, в котором будут храниться элементы CD_APProduct:

var productArrays = [CD_AProduct]!

У вас есть функция сохранения, поэтому мы пропустим этот шаг.

Затем просто создайте простой prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
   if (segue.identifier == "GoToDetailView") {
      let vc = segue.destinationViewController as! CD_AProductItemsView
      let CD_AProduct = productArrays[tableView.indexPathForSelectedRow()!.row]
      vc.CD_AProductDetailView = CD_AProduct
      vc.CD_AProductItemsDetailView = productArrays.detailEntities.allObjects as! Array
  }
}

PS в последней строке detailEntities означает NSSet в вашем списке управляемых объектов. Вы должны изменить это.

Теперь, если вы запустите свое приложение, оно рухнет, потому что tableView.indexPath в этот момент будет равно нулю, потому что никто не предоставил эту информацию для prepareForSegue. Итак, чтобы решить эту проблему, мы должны использовать наш didSelectRowAtIndexPath :

self.performSegueWithIdentifier("GoToDetailView", sender: self)

Мы сделали! Конечно, это очень поздний ответ, но, возможно, он кому-то поможет.

person zzzz    schedule 13.07.2015