Adds ability to delete save states via long press

This commit is contained in:
Riley Testut 2016-03-14 19:22:16 -05:00
parent e08cc1c331
commit 129cef9cb8
2 changed files with 79 additions and 14 deletions

View File

@ -45,6 +45,7 @@ class DatabaseManager
self.validationManagedObjectContext.parentContext = self.managedObjectContext
self.validationManagedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("managedObjectContextWillSave:"), name: NSManagedObjectContextWillSaveNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("managedObjectContextDidSave:"), name: NSManagedObjectContextDidSaveNotification, object: nil)
}
@ -286,18 +287,31 @@ private extension DatabaseManager
// MARK: - Validation -
func validateManagedObjectSaveWithUserInfo(userInfo: [NSObject : AnyObject])
func validateManagedObjectContextSave(managedObjectContext: NSManagedObjectContext)
{
// Remove deleted games from disk
if let deletedObjects = userInfo[NSDeletedObjectsKey] as? Set<NSManagedObject>
// Remove deleted files from disk
for object in managedObjectContext.deletedObjects
{
let games = deletedObjects.filter({ $0 is Game }).map({ self.validationManagedObjectContext.objectWithID($0.objectID) as! Game })
var fileURLs = Set<NSURL>()
for game in games
let temporaryObject = self.validationManagedObjectContext.objectWithID(object.objectID)
switch temporaryObject
{
case let game as Game:
fileURLs.insert(game.fileURL)
case let saveState as SaveState:
fileURLs.insert(saveState.fileURL)
fileURLs.insert(saveState.imageFileURL)
default: break
}
for URL in fileURLs
{
do
{
try NSFileManager.defaultManager().removeItemAtURL(game.fileURL)
try NSFileManager.defaultManager().removeItemAtURL(URL)
}
catch let error as NSError
{
@ -317,16 +331,22 @@ private extension DatabaseManager
// MARK: - Notifications -
dynamic func managedObjectContextDidSave(notification: NSNotification)
@objc func managedObjectContextWillSave(notification: NSNotification)
{
guard let managedObjectContext = notification.object as? NSManagedObjectContext where managedObjectContext.parentContext == self.validationManagedObjectContext else { return }
self.validationManagedObjectContext.performBlockAndWait {
self.validateManagedObjectSaveWithUserInfo(notification.userInfo ?? [:])
self.save()
self.validateManagedObjectContextSave(managedObjectContext)
}
}
@objc func managedObjectContextDidSave(notification: NSNotification)
{
guard let managedObjectContext = notification.object as? NSManagedObjectContext where managedObjectContext.parentContext == self.validationManagedObjectContext else { return }
self.save()
}
// MARK: - File Management -
class func createDirectoryAtURLIfNeeded(URL: NSURL)
@ -340,4 +360,4 @@ private extension DatabaseManager
print(error)
}
}
}
}

View File

@ -98,6 +98,9 @@ extension SaveStatesViewController
self.prototypeCellWidthConstraint = self.prototypeCell.contentView.widthAnchor.constraintEqualToConstant(collectionViewLayout.itemWidth)
self.prototypeCellWidthConstraint.active = true
let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: "handleLongPressGesture:")
self.collectionView?.addGestureRecognizer(longPressGestureRecognizer)
self.updateBackgroundView()
}
@ -128,6 +131,8 @@ extension SaveStatesViewController
private extension SaveStatesViewController
{
//MARK: - Update -
func updateFetchedResultsController()
{
let game = self.delegate.saveStatesViewControllerActiveGame(self)
@ -181,10 +186,27 @@ private extension SaveStatesViewController
let name = saveState.name ?? self.dateFormatter.stringFromDate(saveState.modifiedDate)
cell.textLabel.text = name
}
}
private extension SaveStatesViewController
{
//MARK: - Gestures -
@objc func handleLongPressGesture(gestureRecognizer: UILongPressGestureRecognizer)
{
guard gestureRecognizer.state == .Began else { return }
guard let indexPath = self.collectionView?.indexPathForItemAtPoint(gestureRecognizer.locationInView(self.collectionView)) else { return }
let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
alertController.addAction(UIAlertAction(title: NSLocalizedString("Delete Save State", comment: ""), style: .Destructive, handler: { action in
let saveState = self.fetchedResultsController.objectAtIndexPath(indexPath) as! SaveState
self.deleteSaveState(saveState)
}))
alertController.addAction(UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .Cancel, handler: nil))
self.presentViewController(alertController, animated: true, completion: nil)
}
//MARK: - Save States -
@IBAction func addSaveState()
{
let backgroundContext = DatabaseManager.sharedManager.backgroundManagedObjectContext()
@ -212,8 +234,28 @@ private extension SaveStatesViewController
self.delegate?.saveStatesViewController(self, updateSaveState: saveState)
saveState.managedObjectContext?.saveWithErrorLogging()
}
func deleteSaveState(saveState: SaveState)
{
let confirmationAlertController = UIAlertController(title: NSLocalizedString("Confirm Deletion", comment: ""), message: NSLocalizedString("Are you sure you want to delete this save state? This cannot be undone.", comment: ""), preferredStyle: .Alert)
confirmationAlertController.addAction(UIAlertAction(title: "Delete", style: .Default, handler: { action in
let backgroundContext = DatabaseManager.sharedManager.backgroundManagedObjectContext()
backgroundContext.performBlock {
let temporarySaveState = backgroundContext.objectWithID(saveState.objectID)
backgroundContext.deleteObject(temporarySaveState)
backgroundContext.saveWithErrorLogging()
}
}))
confirmationAlertController.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
self.presentViewController(confirmationAlertController, animated: true, completion: nil)
}
}
//MARK: - <UICollectionViewDataSource> -
extension SaveStatesViewController
{
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
@ -230,6 +272,7 @@ extension SaveStatesViewController
}
}
//MARK: - <UICollectionViewDelegate> -
extension SaveStatesViewController
{
override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)
@ -245,6 +288,7 @@ extension SaveStatesViewController
}
}
//MARK: - <UICollectionViewDelegateFlowLayout> -
extension SaveStatesViewController: UICollectionViewDelegateFlowLayout
{
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
@ -256,6 +300,7 @@ extension SaveStatesViewController: UICollectionViewDelegateFlowLayout
}
}
//MARK: - <NSFetchedResultsControllerDelegate> -
extension SaveStatesViewController: NSFetchedResultsControllerDelegate
{
func controllerDidChangeContent(controller: NSFetchedResultsController)