制作计数器应用程序 - 保存到Core Data后是否必须执行某些操作?

时间:2015-08-04 23:25:37

标签: swift core-data increment

尝试使用Swift并创建我的第一个“app”。我实际上是创建一个cookie-clicker克隆,你只需重复点击屏幕中心的图像就可以增加你的分数。

我遇到一些问题,点击图片一次会将我的分数增加1,但再次点击它时,分数会保持为1。

我几乎肯定我在保存到CoreData后应该做点什么 - 我只是不知道是什么。我必须刷新视图吗?对不起新手问题

@IBAction func tapHomeImage(sender: AnyObject) {
    //Score is the name of my Entity, with "points" being an attribute
    let entity = NSEntityDescription.entityForName("Score", inManagedObjectContext: managedObjectContext!)
    let score = Score(entity: entity!, insertIntoManagedObjectContext: managedObjectContext!)

    // **As an aside question, is there a more efficient way to code the below? The issue I have is that score.points is of type NSNumber
    let intScore = score.points as Int
    let incrementedIntScore = intScore + 1
    score.points = NSNumber(integer: incrementedIntScore)

    var error: NSError?
    managedObjectContext?.save(&error)

    //homeScoreLabel is an IBOutlet for the Score displayed on the page
    homeScoreLabel?.text = "\(score.points)"
}

非常感谢!

1 个答案:

答案 0 :(得分:0)

在保存之后,您无需执行任何操作,您需要在之前调用此方法。您需要找到已存在的Score实例,然后使用它。

当你走到这一行时:

let score = Score(entity: entity!, insertIntoManagedObjectContext: managedObjectContext!)

每次运行此方法时,都会创建Score实体的新实例。所以当你这样做时:

let intScore = score.points as Int
let incrementedIntScore = intScore + 1
score.points = NSNumber(integer: incrementedIntScore)

您每次都在使用全新的实例。分数最初为零,您总是将其增加到1。

你应该做什么:

  1. 使用Score的单个实例并将其另存为视图控制器的属性。也就是说,有这样的事情:

    var score: Score?
    
  2. 在视图控制器加载时,为此属性分配一个值。由于您要保存数据,因此应使用executeFetchRequest查找以前保存的实例。如果不存在先前的实例,则然后通过insertIntoManagedObjectContext创建一个新实例。

  3. 在此IBAction

  4. 中使用该实例

    还有其他方法可以修复代码。关键是要确保每次都使用相同的Score实例,而不是每次都创建一个新实例。