【发布时间】:2015-06-04 08:40:43
【问题描述】:
我看过很多教程,它们确实帮助我理解了父子托管对象上下文以及与此相关的其他内容。我准备开始在我的应用程序中使用它,但我有一个问题。为什么没有人使用单例来保持主要的托管对象上下文。我想从 AppDelegate 中提取与核心数据相关的对象并将其设置为自己的类会更好吗?类似Tutorial at raywenderlich.com 的内容。但是他们仍然实例化 CoreDataStack 类(这没问题,单例也必须实例化),并且当需要时,他们在 prepareForSegue 中设置 managedObjectContext (并将其设置为 AppDelegate 中的第一个视图控制器)。为什么不消除这种需求而只使用单例 CoreDataStack 并且如果需要可以在每个控制器中使用 managedObjectContext 呢?
第二个和额外的问题:我认为控制器中的代码越少而其他类中的代码越多越好。我认为它有助于提高可读性。那么,如果我将这段代码从控制器中移出并将其设置为 CoreDataStack 类或其他有助于处理 Core Data 请求和响应的类:
func surfJournalFetchRequest() -> NSFetchRequest {
let fetchRequest =
NSFetchRequest(entityName: "JournalEntry")
fetchRequest.fetchBatchSize = 20
let sortDescriptor =
NSSortDescriptor(key: "date", ascending: false)
fetchRequest.sortDescriptors = [sortDescriptor]
return fetchRequest
}
我知道这是可能的,但它更好吗?如果您从我这里获得应用程序代码,如果在控制器中是一行 CoreDataStack.fetchRequest("JournalEntry", sortedKey: "date") 会更好吗?
如果我把这段代码插入单例并创建带有闭包的函数呢?我将在单例中创建子托管上下文并在其中执行所需的操作,在控制器中我只需更改 UI:
func exportCSVFile() {
navigationItem.leftBarButtonItem = activityIndicatorBarButtonItem()
let privateContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateContext.persistentStoreCoordinator = coreDataStack.context.persistentStoreCoordinator
privateContext.performBlock { () -> Void in
var fetchRequestError:NSError? = nil
let results = privateContext.executeFetchRequest(self.surfJournalFetchRequest(), error: &fetchRequestError)
if results == nil {
println("ERROR: \(fetchRequestError)")
}
let exportFilePath = NSTemporaryDirectory() + "export.csv"
let exportFileURL = NSURL(fileURLWithPath: exportFilePath)!
NSFileManager.defaultManager().createFileAtPath(exportFilePath, contents: NSData(), attributes: nil)
var fileHandleError: NSError? = nil
let fileHandle = NSFileHandle(forWritingToURL: exportFileURL, error: &fileHandleError)
if let fileHandle = fileHandle {
for object in results! {
let journalEntry = object as! JournalEntry
fileHandle.seekToEndOfFile()
let csvData = journalEntry.csv().dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
fileHandle.writeData(csvData!)
}
fileHandle.closeFile()
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.navigationItem.leftBarButtonItem =
self.exportBarButtonItem()
println("Export Path: \(exportFilePath)")
self.showExportFinishedAlertView(exportFilePath)
})
} else {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.navigationItem.leftBarButtonItem = self.exportBarButtonItem()
println("ERROR: \(fileHandleError)")
})
}
}
}
我只是想确保我的方法可以,并且会比原来的更好。谢谢
【问题讨论】:
标签: ios swift core-data singleton nsmanagedobjectcontext