Refactors SaveState.isPreview attribute to Game.previewSaveState relationship

This commit is contained in:
Riley Testut 2016-05-19 02:40:07 -05:00
parent 304da44f3c
commit 290f1b93e5
5 changed files with 16 additions and 15 deletions

View File

@ -25,6 +25,7 @@ extension Game
case typeIdentifier case typeIdentifier
case gameCollections case gameCollections
case previewSaveState
} }
} }
@ -38,6 +39,7 @@ class Game: NSManagedObject, GameType
@NSManaged var typeIdentifier: String @NSManaged var typeIdentifier: String
@NSManaged var gameCollections: Set<GameCollection> @NSManaged var gameCollections: Set<GameCollection>
@NSManaged var previewSaveState: SaveState?
var fileURL: NSURL { var fileURL: NSURL {
let fileURL = DatabaseManager.gamesDirectoryURL.URLByAppendingPathComponent(self.filename) let fileURL = DatabaseManager.gamesDirectoryURL.URLByAppendingPathComponent(self.filename)

View File

@ -15,6 +15,7 @@
<attribute name="name" attributeType="String" syncable="YES"/> <attribute name="name" attributeType="String" syncable="YES"/>
<attribute name="typeIdentifier" attributeType="String" syncable="YES"/> <attribute name="typeIdentifier" attributeType="String" syncable="YES"/>
<relationship name="gameCollections" toMany="YES" deletionRule="Nullify" destinationEntity="GameCollection" inverseName="games" inverseEntity="GameCollection" syncable="YES"/> <relationship name="gameCollections" toMany="YES" deletionRule="Nullify" destinationEntity="GameCollection" inverseName="games" inverseEntity="GameCollection" syncable="YES"/>
<relationship name="previewSaveState" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="SaveState" inverseName="previewGame" inverseEntity="SaveState" syncable="YES"/>
<relationship name="saveStates" toMany="YES" deletionRule="Cascade" destinationEntity="SaveState" inverseName="game" inverseEntity="SaveState" syncable="YES"/> <relationship name="saveStates" toMany="YES" deletionRule="Cascade" destinationEntity="SaveState" inverseName="game" inverseEntity="SaveState" syncable="YES"/>
<uniquenessConstraints> <uniquenessConstraints>
<uniquenessConstraint> <uniquenessConstraint>
@ -40,11 +41,11 @@
</userInfo> </userInfo>
</attribute> </attribute>
<attribute name="identifier" attributeType="String" syncable="YES"/> <attribute name="identifier" attributeType="String" syncable="YES"/>
<attribute name="isPreview" attributeType="Boolean" defaultValueString="NO" syncable="YES"/>
<attribute name="modifiedDate" attributeType="Date" syncable="YES"/> <attribute name="modifiedDate" attributeType="Date" syncable="YES"/>
<attribute name="name" optional="YES" attributeType="String" syncable="YES"/> <attribute name="name" optional="YES" attributeType="String" syncable="YES"/>
<attribute name="type" attributeType="Integer 16" defaultValueString="1" syncable="YES"/> <attribute name="type" attributeType="Integer 16" defaultValueString="1" syncable="YES"/>
<relationship name="game" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Game" inverseName="saveStates" inverseEntity="Game" syncable="YES"/> <relationship name="game" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Game" inverseName="saveStates" inverseEntity="Game" syncable="YES"/>
<relationship name="previewGame" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Game" inverseName="previewSaveState" inverseEntity="Game" syncable="YES"/>
<uniquenessConstraints> <uniquenessConstraints>
<uniquenessConstraint> <uniquenessConstraint>
<constraint value="identifier"/> <constraint value="identifier"/>
@ -52,7 +53,7 @@
</uniquenessConstraints> </uniquenessConstraints>
</entity> </entity>
<elements> <elements>
<element name="Game" positionX="-200" positionY="-72" width="128" height="148"/> <element name="Game" positionX="-200" positionY="-72" width="128" height="165"/>
<element name="GameCollection" positionX="-198" positionY="-207" width="128" height="90"/> <element name="GameCollection" positionX="-198" positionY="-207" width="128" height="90"/>
<element name="SaveState" positionX="-198" positionY="113" width="128" height="165"/> <element name="SaveState" positionX="-198" positionY="113" width="128" height="165"/>
</elements> </elements>

View File

@ -17,13 +17,13 @@ extension SaveState
{ {
case filename case filename
case identifier case identifier
case isPreview
case name case name
case creationDate case creationDate
case modifiedDate case modifiedDate
case type case type
case game case game
case previewGame
} }
@objc enum Type: Int16 @objc enum Type: Int16
@ -40,7 +40,6 @@ class SaveState: NSManagedObject, SaveStateType
@NSManaged var name: String? @NSManaged var name: String?
@NSManaged var modifiedDate: NSDate @NSManaged var modifiedDate: NSDate
@NSManaged var type: Type @NSManaged var type: Type
@NSManaged var isPreview: Bool
@NSManaged private(set) var filename: String @NSManaged private(set) var filename: String
@NSManaged private(set) var identifier: String @NSManaged private(set) var identifier: String
@ -50,6 +49,8 @@ class SaveState: NSManagedObject, SaveStateType
// https://forums.developer.apple.com/thread/20535 // https://forums.developer.apple.com/thread/20535
@NSManaged var game: Game! @NSManaged var game: Game!
@NSManaged var previewGame: Game?
var fileURL: NSURL { var fileURL: NSURL {
let fileURL = DatabaseManager.saveStatesDirectoryURLForGame(self.game).URLByAppendingPathComponent(self.filename) let fileURL = DatabaseManager.saveStatesDirectoryURLForGame(self.game).URLByAppendingPathComponent(self.filename)
return fileURL return fileURL

View File

@ -129,10 +129,8 @@ class GamesViewController: UIViewController
if segue.identifier == "peekEmulationViewController" if segue.identifier == "peekEmulationViewController"
{ {
destinationViewController.deferredPreparationHandler = { [unowned destinationViewController] in destinationViewController.deferredPreparationHandler = { [unowned destinationViewController] in
let predicate = NSPredicate(format: "%K == %@ AND %K == YES", SaveState.Attributes.game.rawValue, game, SaveState.Attributes.isPreview.rawValue) if let saveState = game.previewSaveState
if let saveState = SaveState.instancesWithPredicate(predicate, inManagedObjectContext: DatabaseManager.sharedManager.managedObjectContext, type: SaveState.self).first
{ {
destinationViewController.emulatorCore.startEmulation() destinationViewController.emulatorCore.startEmulation()
destinationViewController.emulatorCore.pauseEmulation() destinationViewController.emulatorCore.pauseEmulation()

View File

@ -358,15 +358,14 @@ private extension SaveStatesViewController
var game = self.delegate.saveStatesViewControllerActiveEmulatorCore(self).game as! Game var game = self.delegate.saveStatesViewControllerActiveEmulatorCore(self).game as! Game
game = backgroundContext.objectWithID(game.objectID) as! Game game = backgroundContext.objectWithID(game.objectID) as! Game
let predicate = NSPredicate(format: "%K == %@ AND %K == YES", SaveState.Attributes.game.rawValue, game, SaveState.Attributes.isPreview.rawValue)
let previousPreviewSaveState = SaveState.instancesWithPredicate(predicate, inManagedObjectContext: backgroundContext, type: SaveState.self).first
previousPreviewSaveState?.isPreview = false
if let saveState = saveState if let saveState = saveState
{ {
let previewSaveState = backgroundContext.objectWithID(saveState.objectID) as! SaveState let previewSaveState = backgroundContext.objectWithID(saveState.objectID) as! SaveState
previewSaveState.isPreview = true game.previewSaveState = previewSaveState
}
else
{
game.previewSaveState = nil
} }
backgroundContext.saveWithErrorLogging() backgroundContext.saveWithErrorLogging()
@ -465,7 +464,7 @@ private extension SaveStatesViewController
if self.traitCollection.forceTouchCapability == .Available if self.traitCollection.forceTouchCapability == .Available
{ {
if !saveState.isPreview if saveState.game.previewSaveState != saveState
{ {
let previewAction = Action(title: NSLocalizedString("Set as Preview Save State", comment: ""), style: .Default, action: { action in let previewAction = Action(title: NSLocalizedString("Set as Preview Save State", comment: ""), style: .Default, action: { action in
self.updatePreviewSaveState(saveState) self.updatePreviewSaveState(saveState)