summaryrefslogtreecommitdiff
path: root/Juick/CoreDataStack.h
blob: b430654f5f72cdf52695434449e2c77e27e9760d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
//
//  CoreDataStack.h
//  Juick
//
//  Created by Vitaly Takmazov on 15/10/2017.
//  Copyright © 2017 com.juick. All rights reserved.
//

@import Foundation;
@import CoreData;

NS_ASSUME_NONNULL_BEGIN

API_AVAILABLE(macosx(10.12),ios(10.0),tvos(10.0),watchos(3.0))
@interface CoreDataStack : NSObject

/**
 The default directory for the persistent stores on the current platform.
 @return An `NSURL` for the directory containing the persistent store(s). If the
 persistent store does not exist it will be created by default in this location
 when loaded.
 */
+ (NSURL *)defaultDirectoryURL;

///---------------------
/// @name Properties
///---------------------

/**
 A read-only flag indicating if the persistent store is loaded.
 */
@property (readonly, assign, getter=isStoreLoaded) BOOL storeLoaded;

/**
 The managed object context associated with the main queue (read-only). To
 perform tasks on a private background queue see `performBackgroundTask:` and
 `newPrivateContext`.
 The context is configured to be generational and to automatically consume save
 notifications from other contexts.
 */
@property (readonly, strong) NSManagedObjectContext *viewContext;

/**
 The `URL` of the persistent store for this Core Data Stack. If there are more
 than one stores this property returns the first store it finds. The store may
 not yet exist. It will be created at this URL by default when first loaded.
 
 This is a readonly property to create a persistent store in a different
 location use `loadStoreAtURL:withCompletionHandler`. To move an existing
 persistent store use `replacePersistentStoreAtURL:withPersistentStoreFromURL:`.
 */
@property (readonly, copy) NSURL *storeURL;

/**
 A flag that indicates whether this store is read-only. Set this value to YES
 before loading the persistent store if you want a read-only store (for example
 if you are loading a store from the application bundle).
 
 Default is NO.
 */
@property (assign, getter=isReadOnly) BOOL readOnly;

/**
 A flag that indicates whether the store is added asynchronously. Set this
 value before loading the persistent store.
 
 Default is YES.
 */
@property (assign) BOOL shouldAddStoreAsynchronously;

/**
 A flag that indicates whether the store should be migrated
 automatically if the store model version does not match the
 coordinators model version.
 
 Set this value before loading the persistent store.
 Default is YES.
 */
@property (assign) BOOL shouldMigrateStoreAutomatically;

/**
 A flag that indicates whether a mapping model should be inferred
 when migrating a store.
 Set this value before loading the persistent store.
 
 Default is YES.
 */
@property (assign) BOOL shouldInferMappingModelAutomatically;

///---------------------
/// @name Initialization
///---------------------

- (instancetype)init NS_UNAVAILABLE;

/**
 Creates and returns a `CoreDataController` object. This is the designated
 initializer for the class. It creates the managed object model, persistent
 store coordinator and main managed object context but does not load the
 persistent store.
 
 @param name The name of the `NSManagedObjectModel` and by default the name used
 for the persistent store
 @return A `CoreDataController` object initialized with the given name.
 */
- (instancetype)initWithName:(NSString *)name NS_DESIGNATED_INITIALIZER;

///---------------------------------
/// @name Loading a Persistent Store
///---------------------------------

/**
 Load the persistent store.
 @param handler This handler block is executed on the calling thread when the
 loading of the persistent store has completed.
 
 To override the default name and location of the persistent store use
 `loadStoreAtURL:withCompletionHandler:`.
 */
- (void)loadStoreWithCompletionHandler:(void(^)(NSError *))handler;

/**
 Load the persistent store.
 @param storeURL The URL for the location of the persistent store. It will be created if it does not exist.
 @param handler This handler block is executed on the calling thread when the
 loading of the persistent store has completed.
 */
- (void)loadStoreAtURL:(NSURL *)storeURL withCompletionHandler:(void(^)(NSError * _Nullable))handler;

///----------------------------------
/// @name Managing a Persistent Store
///----------------------------------

/**
 A flag indicating if the persistent store exists at the specified URL.
 @param storeURL An `NSURL` object for the location of the peristent store.
 @return YES if a file exists at the specified URL otherwise NO.
 @warning This method checks if a file exists at the specified location but
 does not verify if it is a valid persistent store.
 */
- (BOOL)persistentStoreExistsAtURL:(NSURL *)storeURL;

/**
 Replace a persistent store.
 @param destinationURL An `NSURL` for the persistent store to be replaced.
 @param sourceURL An `NSURL` for the source persistent store.
 @return A flag indicating if the operation was successful.
 */
- (BOOL)replacePersistentStoreAtURL:(NSURL *)destinationURL withPersistentStoreFromURL:(NSURL *)sourceURL;

/**
 Destroy a persistent store.
 @param storeURL An `NSURL` for the persistent store to be destroyed.
 @return A flag indicating if the operation was successful.
 */
- (BOOL)destroyPersistentStoreAtURL:(NSURL *)storeURL;

///----------------------------------
/// @name Performing Background tasks
///----------------------------------

/**
 Execute a block on a new private queue context.
 @param block A block to execute on a newly created private context. The context
 is passed to the block as a paramater.
 */
- (void)performBackgroundTask:(void(^)(NSManagedObjectContext *))block;

/**
 Create and return a new private queue `NSManagedObjectContext`. The new context
 is set to consume `NSManagedObjectContextSave` broadcasts automatically.
 @return A new private managed object context.
 */
- (NSManagedObjectContext *)newPrivateContext NS_RETURNS_RETAINED;

///------------------------
/// @name NSManagedObjectID
///------------------------

/**
 Return an object ID for the specified URI representation if a matching
 store is available.
 @param url An `NSURL` containing a URI of a managed object.
 @return An `NSManagedObjectID` or `nil`.
 */
- (NSManagedObjectID *)managedObjectIDForURIRepresentation:(NSURL *)url;

@end
NS_ASSUME_NONNULL_END