Ios5 Restkit和死锁

Ios5 Restkit和死锁,ios5,deadlock,restkit,Ios5,Deadlock,Restkit,目前我正在使用Restkit控制我应用程序中的所有(核心)数据。我使用它来使用RKManagedObjectMapping与服务器保持同步,并使用[MyNsmanagedObjectCreateEntity]和[[RKObjectManager§sharedManager].objectStore save]在Grand Central Dispatch中手动编辑项目 是否有任何建议以这种或其他方式执行此操作?因为有时候应用程序在执行Restkit的代码时会陷入死锁 + (NSArray*)ob

目前我正在使用Restkit控制我应用程序中的所有(核心)数据。我使用它来使用RKManagedObjectMapping与服务器保持同步,并使用[MyNsmanagedObjectCreateEntity]和[[RKObjectManager§sharedManager].objectStore save]在Grand Central Dispatch中手动编辑项目

是否有任何建议以这种或其他方式执行此操作?因为有时候应用程序在执行Restkit的代码时会陷入死锁

+ (NSArray*)objectsWithFetchRequest:(NSFetchRequest*)fetchRequest {
    NSError* error = nil;
    NSArray* objects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
    if (objects == nil) {
        RKLogError(@"Error: %@", [error localizedDescription]);
    }
    return objects;
}
有了这个

- (NSError*)save {
    NSManagedObjectContext* moc = [self managedObjectContext];
    NSError *error;
    @try {
        if (![moc save:&error]) {
            if (self.delegate != nil && [self.delegate respondsToSelector:@selector(managedObjectStore:didFailToSaveContext:error:exception:)]) {
…

同时。在切换到Restkit之前,我在每个实体编辑代码的周围放置了一个“context performBlockAndWait”,并且为安全起见,没有死锁。我没有其他NSManagedObjectContext或我自己创建的东西,都来自Restkit。

在我的例子中,问题是我正在跨线程边界传递NSManagedObjects,并在线程上使用它们,而不是从各自的NSManagedObjectContext获取它们的线程。对我来说,这真的很微妙,因为我知道我不应该这么做,但无论如何我都是意外地这么做的。我没有传递托管对象,而是开始传递NSManagedObjects(然后从本地线程的MOC获取),此后就没有遇到死锁。我建议您对代码进行深度扫描,以确保只在生成托管对象的线程中使用托管对象。

在我的例子中,问题是我正在跨线程边界传递NSManagedObjects,并在线程上使用它们,而不是在从各自的NSManagedObjects上下文中获取它们的线程上使用它们。对我来说,这真的很微妙,因为我知道我不应该这么做,但无论如何我都是意外地这么做的。我没有传递托管对象,而是开始传递NSManagedObjects(然后从本地线程的MOC获取),此后就没有遇到死锁。我建议您对代码进行深度扫描,以确保仅在生成托管对象的线程中使用托管对象。

我们在应用程序中遇到了这个问题。基本上,CoreData嵌套上下文在iOS5中非常有缺陷,因此不能像宣传的那样工作。这有许多表现形式,但其中一个是上面描述的问题,即获取请求与后台操作之间的死锁。这是一段有启发性的引语:

NSFetchedResultsController死锁

您永远不希望应用程序死锁。有了NSFetchedResultsController和嵌套上下文,这很容易做到。使用与上述相同的UIManagedDocument设置,在专用队列上下文中执行fetch请求,同时在主队列上下文中使用NSFETCHEEDRESULTSCONTROLLER可能会死锁。如果你同时开始这两项工作,它的一致性几乎达到100%。NSFetchedResultsController可能正在获取一个不该获取的锁。据报道,这在即将发布的iOS中已被修复

有一个保持嵌套上下文的可能修复程序。我见过其他人喜欢它,基本上是自由地应用
-performAndWait:
调用。我们还没有尝试过(iOS5在我们的用户群中有个位数的百分比)。否则,我们现在唯一知道的另一个“修复”是放弃iOS5的嵌套上下文(参见)

CoreData在多线程(iOS 5)中继续被彻底破坏,这对苹果来说是不可原谅的。现在,信任苹果的CoreData(多线程,iCloud)似乎给你带来了巨大的痛苦。我们在应用程序中遇到了这个问题。基本上,CoreData嵌套上下文在iOS5中非常有缺陷,因此不能像宣传的那样工作。这有许多表现形式,但其中一个是上面描述的问题,即获取请求与后台操作之间的死锁。这是一段有启发性的引语:

NSFetchedResultsController死锁

您永远不希望应用程序死锁。有了NSFetchedResultsController和嵌套上下文,这很容易做到。使用与上述相同的UIManagedDocument设置,在专用队列上下文中执行fetch请求,同时在主队列上下文中使用NSFETCHEEDRESULTSCONTROLLER可能会死锁。如果你同时开始这两项工作,它的一致性几乎达到100%。NSFetchedResultsController可能正在获取一个不该获取的锁。据报道,这在即将发布的iOS中已被修复

有一个保持嵌套上下文的可能修复程序。我见过其他人喜欢它,基本上是自由地应用
-performAndWait:
调用。我们还没有尝试过(iOS5在我们的用户群中有个位数的百分比)。否则,我们现在唯一知道的另一个“修复”是放弃iOS5的嵌套上下文(参见)


CoreData在多线程(iOS 5)中继续被彻底破坏,这对苹果来说是不可原谅的。现在,信任苹果的CoreData(多线程,iCloud)似乎给你带来了巨大的痛苦,这是一个很好的例子。

我相信我也遇到了类似的问题。你有没有这样做过?我试着用RestKit对象映射去掉所有gcd调用。现在它成功了,你这是什么意思?背景线程上的所有RestKit对象映射都被删除了吗?那么,您对主线程的UI性能做了什么呢?从主线程调用objectmapping。restkit将执行线程。不幸的是,在我的情况下,这是不可能的。我相信我遇到了类似的问题。你有没有这样做过?我试着用RestKit对象映射去掉所有gcd调用。现在它成功了,你这是什么意思?背景线程上的所有RestKit对象映射都被删除了吗?那么,您对主线程的UI性能做了什么呢?从主线程调用objectmapping。restkit将执行线程处理。不幸的是,在我的情况下,这是不可能的!这是我的问题,没错!这是我的问题。