相关疑难解决方法(0)

使核心数据线程安全

长话短说,我厌倦了与之相关的荒谬的并发规则NSManagedObjectContext(或者更确切地说,它完全缺乏对并发性的支持以及如果你试图共享NSManagedObjectContext跨线程而爆炸或做其他不正确的事情),并且我正在尝试实现线程安全的变体.

基本上我所做的是创建一个子类来跟踪它创建的线程,然后将所有方法调用映射回该线程.这样做的机制有点令人费解,但问题的关键在于我有一些辅助方法,如:

- (NSInvocation*) invocationWithSelector:(SEL)selector {
    //creates an NSInvocation for the given selector
    NSMethodSignature* sig = [self methodSignatureForSelector:selector];    
    NSInvocation* call = [NSInvocation invocationWithMethodSignature:sig];
    [call retainArguments];
    call.target = self;

    call.selector = selector;

    return call;
}

- (void) runInvocationOnContextThread:(NSInvocation*)invocation {
    //performs an NSInvocation on the thread associated with this context
    NSThread* currentThread = [NSThread currentThread];
    if (currentThread != myThread) {
        //call over to the correct thread
        [self performSelector:@selector(runInvocationOnContextThread:) onThread:myThread withObject:invocation waitUntilDone:YES];
    }
    else {
        //we're okay to invoke …
Run Code Online (Sandbox Code Playgroud)

concurrency multithreading core-data ios

13
推荐指数
1
解决办法
5401
查看次数

核心数据和线程

我正在开发一个使用核心数据的应用程序,我知道这不是线程安全的,但很难理解如何正确管理它.让我解释一下到目前为止我所拥有的......

我创建了一个单例,启动了托管对象,然后可供所有其他类使用,这似乎正常工作,因为所有类都接收到相同的托管对象地址.

然后我有两个按此顺序执行的clases ...

  1. 数据加载.这将获得记录计数,如果为零则加载核心数据库.
  2. 然后,Tableview显示步骤1中存储的数据.

我的问题是步骤1.始终返回零记录,并且步骤2.正在工作并返回正确的记录计数.

已完成一些测试问题1.由于线程正在运行,如果我在同一个线程上发送请求,那么托管对象在其上创建就可以完美地运行.

那么为什么它在第1类.我必须确保请求是在正确的线程但在第2类.它只是工作,或者它只是纯粹的运气.是否有线程和核心数据的推荐和文档化方法?

谢谢

iphone core-data thread-safety ipad ios

4
推荐指数
1
解决办法
1351
查看次数