长话短说,我厌倦了与之相关的荒谬的并发规则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) 我正在开发一个使用核心数据的应用程序,我知道这不是线程安全的,但很难理解如何正确管理它.让我解释一下到目前为止我所拥有的......
我创建了一个单例,启动了托管对象,然后可供所有其他类使用,这似乎正常工作,因为所有类都接收到相同的托管对象地址.
然后我有两个按此顺序执行的clases ...
我的问题是步骤1.始终返回零记录,并且步骤2.正在工作并返回正确的记录计数.
已完成一些测试问题1.由于线程正在运行,如果我在同一个线程上发送请求,那么托管对象在其上创建就可以完美地运行.
那么为什么它在第1类.我必须确保请求是在正确的线程但在第2类.它只是工作,或者它只是纯粹的运气.是否有线程和核心数据的推荐和文档化方法?
谢谢