This commit is contained in:
John Rommel Estropia
2016-07-21 02:45:42 +09:00
parent 267c21063a
commit a638620858
85 changed files with 1621 additions and 1819 deletions

View File

@@ -55,7 +55,7 @@ internal final class CoreStoreFetchedResultsController: NSFetchedResultsControll
context: context,
applyAffectedStores: false
)
applyFetchClauses(fetchRequest: fetchRequest.cs_dynamicCast())
applyFetchClauses(fetchRequest: unsafeBitCast(fetchRequest, to: NSFetchRequest<NSManagedObject>.self))
if let from = from {

View File

@@ -47,7 +47,7 @@ internal protocol FetchedResultsControllerHandler: class {
// MARK: - FetchedResultsControllerDelegate
internal final class FetchedResultsControllerDelegate<EntityType: NSManagedObject>: NSObject, NSFetchedResultsControllerDelegate {
internal final class FetchedResultsControllerDelegate<EntityType: NSManagedObject>: NSObject, NSFetchedResultsControllerDelegate {
// MARK: Internal

View File

@@ -25,68 +25,7 @@
import Foundation
// MARK: - Custom AutoreleasePool
internal func cs_autoreleasepool(@noescape _ closure: () -> Void) {
autoreleasepool(closure)
}
internal func cs_autoreleasepool<T>(@noescape _ closure: () -> T) -> T {
var closureValue: T!
autoreleasepool {
closureValue = closure()
}
return closureValue
}
internal func cs_autoreleasepool<T>(@noescape _ closure: () throws -> T) throws -> T {
var closureValue: T!
var closureError: ErrorProtocol?
autoreleasepool {
do {
closureValue = try closure()
}
catch {
closureError = error
}
}
if let closureError = closureError {
throw closureError
}
return closureValue
}
internal func cs_autoreleasepool(@noescape _ closure: () throws -> Void) throws {
var closureError: ErrorProtocol?
autoreleasepool {
do {
try closure()
}
catch {
closureError = error
}
}
if let closureError = closureError {
throw closureError
}
}
// MARK: Associated Objects
internal func cs_getAssociatedObjectForKey<T: AnyObject>(_ key: UnsafePointer<Void>, inObject object: AnyObject) -> T? {

View File

@@ -56,7 +56,7 @@ internal final class MigrationManager: NSMigrationManager, ProgressReporting {
}
// MARK: NSProgressReporting
// MARK: ProgressReporting
let progress: Progress
}

View File

@@ -1,20 +0,0 @@
//
// NSFetchRequest+CoreStore.swift
// CoreStore
//
// Created by John Rommel Estropia on 2016/07/20.
// Copyright © 2016 John Rommel Estropia. All rights reserved.
//
import CoreData
internal extension NSFetchRequest {
// MARK: Internal
@nonobjc
internal func cs_dynamicCast<U: NSFetchRequestResult>() -> NSFetchRequest<U> {
return unsafeBitCast(self, to: NSFetchRequest<U>.self)
}
}

View File

@@ -78,20 +78,10 @@ internal extension NSManagedObjectContext {
@nonobjc
internal func setupForCoreStoreWithContextName(_ contextName: String) {
#if USE_FRAMEWORKS
self.name = contextName
#else
if #available(iOS 8.0, *) {
self.name = contextName
}
#endif
self.name = contextName
self.observerForWillSaveNotification = NotificationObserver(
notificationName: NSNotification.Name.NSManagedObjectContextWillSave.rawValue,
notificationName: NSNotification.Name.NSManagedObjectContextWillSave,
object: self,
closure: { (note) -> Void in

View File

@@ -199,7 +199,7 @@ internal extension NSManagedObjectContext {
}
@nonobjc
internal func fetchCount<T: NSManagedObject>(_ fetchRequest: NSFetchRequest<T>) -> Int? {
internal func fetchCount(_ fetchRequest: NSFetchRequest<NSFetchRequestResult>) -> Int? {
var count = 0
var countError: ErrorProtocol?
@@ -366,7 +366,7 @@ internal extension NSManagedObjectContext {
var fetchError: ErrorProtocol?
self.performAndWait {
cs_autoreleasepool {
autoreleasepool {
do {

View File

@@ -72,16 +72,18 @@ internal extension NSManagedObjectContext {
#if os(iOS) || os(OSX)
context.observerForDidImportUbiquitousContentChangesNotification = NotificationObserver(
notificationName: NSNotification.Name.NSPersistentStoreDidImportUbiquitousContentChanges.rawValue,
notificationName: NSNotification.Name.NSPersistentStoreDidImportUbiquitousContentChanges,
object: coordinator,
closure: { [weak context] (note) -> Void in
context?.perform { () -> Void in
let updatedObjectIDs = ((note as NSNotification).userInfo?[NSUpdatedObjectsKey] as? Set<NSManagedObjectID>) ?? []
for objectID in updatedObjectIDs {
if let updatedObjectIDs = (note.userInfo?[NSUpdatedObjectsKey] as? Set<NSManagedObjectID>) {
context?.object(with: objectID).willAccessValue(forKey: nil)
for objectID in updatedObjectIDs {
context?.object(with: objectID).willAccessValue(forKey: nil)
}
}
context?.mergeChanges(fromContextDidSave: note)
}
@@ -102,7 +104,7 @@ internal extension NSManagedObjectContext {
context.undoManager = nil
context.setupForCoreStoreWithContextName("com.corestore.maincontext")
context.observerForDidSaveNotification = NotificationObserver(
notificationName: NSNotification.Name.NSManagedObjectContextDidSave.rawValue,
notificationName: NSNotification.Name.NSManagedObjectContextDidSave,
object: rootContext,
closure: { [weak context] (note) -> Void in
@@ -113,10 +115,12 @@ internal extension NSManagedObjectContext {
}
let mergeChanges = { () -> Void in
let updatedObjects = ((note as NSNotification).userInfo?[NSUpdatedObjectsKey] as? Set<NSManagedObject>) ?? []
for object in updatedObjects {
if let updatedObjects = (note.userInfo?[NSUpdatedObjectsKey] as? Set<NSManagedObject>) {
context.object(with: object.objectID).willAccessValue(forKey: nil)
for object in updatedObjects {
context.object(with: object.objectID).willAccessValue(forKey: nil)
}
}
context.mergeChanges(fromContextDidSave: note)
}

View File

@@ -47,7 +47,7 @@ internal extension NSManagedObjectModel {
guard let versionInfo = NSDictionary(contentsOf: versionInfoPlistURL),
let versionHashes = versionInfo["NSManagedObjectModel_VersionHashes"] as? [String: AnyObject] else {
CoreStore.abort("Could not load \(cs_typeName(NSManagedObjectModel)) metadata from path \"\(versionInfoPlistURL)\".")
CoreStore.abort("Could not load \(cs_typeName(NSManagedObjectModel.self)) metadata from path \"\(versionInfoPlistURL)\".")
}
let modelVersions = Set(versionHashes.keys)
@@ -106,7 +106,7 @@ internal extension NSManagedObjectModel {
return rootModel
}
CoreStore.abort("Could not create an \(cs_typeName(NSManagedObjectModel)) from the model at URL \"\(modelFileURL)\".")
CoreStore.abort("Could not create an \(cs_typeName(NSManagedObjectModel.self)) from the model at URL \"\(modelFileURL)\".")
}
@nonobjc

View File

@@ -32,16 +32,16 @@ internal final class NotificationObserver {
// MARK: Public
let notificationName: String
let notificationName: Notification.Name
let object: AnyObject?
let observer: NSObjectProtocol
init(notificationName: String, object: AnyObject?, queue: OperationQueue? = nil, closure: (note: Notification) -> Void) {
init(notificationName: Notification.Name, object: AnyObject?, queue: OperationQueue? = nil, closure: (note: Notification) -> Void) {
self.notificationName = notificationName
self.object = object
self.observer = NotificationCenter.default.addObserver(
forName: NSNotification.Name(rawValue: notificationName),
forName: notificationName,
object: object,
queue: queue,
using: closure
@@ -52,7 +52,7 @@ internal final class NotificationObserver {
NotificationCenter.default.removeObserver(
self.observer,
name: NSNotification.Name(rawValue: self.notificationName),
name: self.notificationName,
object: self.object
)
}