Swift 2.0中后台线程中的CoreData。干净的方式?

Swift 2.0中后台线程中的CoreData。干净的方式?,swift,core-data,Swift,Core Data,我已经和这个问题斗争了整整8天了。所以我相信是时候向这里的大师寻求帮助了 好的,所以我尝试按照Bob叔叔的干净架构实现一个应用程序,这样我就可以设置ViewController、模型、交互器、存储库和演示器 我的AppDelegate中没有CoreData的任何痕迹,什么都没有。所有这些都是在MyAppCoreData类中完成的 存储库被注入AppDelegate,交互者访问注入的对象,不仅访问CoreData内容,还访问Parse和另一个私有API。解析和私有API工作得很好。 CoreDat

我已经和这个问题斗争了整整8天了。所以我相信是时候向这里的大师寻求帮助了

好的,所以我尝试按照Bob叔叔的干净架构实现一个应用程序,这样我就可以设置ViewController、模型、交互器、存储库和演示器

我的AppDelegate中没有CoreData的任何痕迹,什么都没有。所有这些都是在MyAppCoreData类中完成的

存储库被注入AppDelegate,交互者访问注入的对象,不仅访问CoreData内容,还访问Parse和另一个私有API。解析和私有API工作得很好。 CoreData存储库也“起作用”。它不会抛出任何异常。但CoreData中没有插入任何数据,当我获取时,它是空的

我相信我在持久存储协调器+主上下文+私有上下文方面遇到了一些问题。。。但是还没有找到它是什么

那么让我们转到代码:

AppDelegate

class AppDelegate: UIResponder, UIApplicationDelegate {    
    var window: UIWindow?

    let container = Container() { c in
        c.register(UserDataStore.self) { _ in ParseRepository() } 
        c.register(BabyNamesDataStore.self) { _ in BabyNameRepository.sharedInstance }
        c.register(GenericRepository.self) { r in
            GenericRepository(_userDataStore: r.resolve(UserDataStore.self)!,  _babyNameDataStore: r.resolve(BabyNamesDataStore.self)!)
        }
    }
...
然后,我的交互程序具有以下init()函数:

class MainInteractor: MainInteractorInput
{
    var output: MainInteractorOutput!
    var worker: GenericRepository?

    init() {
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        worker = appDelegate.container.resolve(GenericRepository.self)
    }
最后,我的CoreDataStore是一个单例(之前不是,我可以看到它由于某种原因被Swinject实例化了两次):

差不多就是这样。我没有例外,但它根本不起作用。 有谁能帮助这个绝望的人吗?:)

谢谢

更新

我遵循Raymund的“清洁商店”理念来实施我自己的理念,发现如下:

我发现在视图控制器中接收演示者响应的函数不在主线程中。所以我必须补充一点:

func displaySomething(viewModel: LoginViewModel) {
        if viewModel.loginStatus {
            let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            appDelegate.prepareSlideOutVC()
            //When user is not logged in, the SlideOut Menu is not loaded. So when he logs in, we must load it.
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
                dispatch_async(dispatch_get_main_queue()) {
                    self.router.navigateToMainScene()
                }
            }
        } 
    }
添加dispatch_async解决了少数情况下的问题,但不是所有情况下的问题。。。我还在想办法。 因此,基本上,在我登录并收到演示者的响应后,我激活segue以转到MainVC,但这是在另一个线程中。
还在努力解决这个问题。

你能更好地定义“不工作”吗?您如何知道这个核心数据堆栈是实例化的?您是否插入了对象(您如何知道)?在没有限制结果集的谓词的情况下进行回迁时,是否找到插入的对象?@Jonah调用了CoreData类的init()方法,并实例化了managedContext和privateContext。在整个测试过程中,我发现两个对象的内存地址都是相同的。我在fetch()方法和insert()方法中也有一个断点。在那里一切都很顺利——就像在中一样,执行流没有进入catch块……太好了,那么什么不起作用呢?听起来问题可能出在你的谓词上,但你必须测试才能找到答案。获取请求是否返回不带谓词的结果?是否可以使用插入的对象的托管对象id(请参见
existingObjectWithID:
)查找插入的对象?你还可以如何测试你的应用程序来了解更多关于什么不起作用的信息?@Jonah没有谓词也没有结果。但我发现了一个非常奇怪的行为:当我启动应用程序并在coredata中执行fetch()时,没有结果。然后,我导航到另一个屏幕。然后当我回到上一个屏幕时。。。那里数据就在那里。。。。我基本上做了一些非常错误的事情……听起来您需要研究何时相对于insert方法调用此fetch方法,以及如何/何时更新UI以反映结果。
func displaySomething(viewModel: LoginViewModel) {
        if viewModel.loginStatus {
            let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            appDelegate.prepareSlideOutVC()
            //When user is not logged in, the SlideOut Menu is not loaded. So when he logs in, we must load it.
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
                dispatch_async(dispatch_get_main_queue()) {
                    self.router.navigateToMainScene()
                }
            }
        } 
    }