ios - NSManagedObject 作为 MKAnnotation 和核心数据并发

标签 ios objective-c core-data thread-safety mkannotation

我正在使用我认为是 NSManagedObject 子类的一个相当典型的实现,该子类符合 MKAnnotation 协议(protocol),以便显示在 MKMapView。查看 setter 和 getter:

-(CLLocationCoordinate2D)coordinate {
    CLLocationCoordinate2D coord = EMPTY_LOCATION_COORDINATE;
    BOOL validLong = (self.longitude != nil) && ([self.longitude doubleValue] != 0);
    BOOL validLat = (self.latitude != nil) && ([self.latitude doubleValue] != 0);
    if (validLong && validLat) {
        coord.longitude = [self.longitude doubleValue];
        coord.latitude = [self.latitude doubleValue];
    }

    return coord;
}

-(void)setCoordinate:(CLLocationCoordinate2D)coordinate {
    if (coordinate.latitude != EMPTY_LOCATION && coordinate.longitude != EMPTY_LOCATION) {
        self.latitude = [NSNumber numberWithDouble:coordinate.latitude];
        self.longitude = [NSNumber numberWithDouble:coordinate.longitude];
    } else {
        self.latitude = nil;
        self.longitude = nil;
    }
}

-(NSString *)title {
    NSString *str = [self.projectName copy];
    return str;
}

这是有效的,根本不会在生产中造成问题。

我正在使用 Core Data 多线程断言调试一些 Core Data 并发问题,我发现它将 gutter 标记为并发冲突。我的猜测是调用坐标的 MKMapview 正在使用后台线程,从技术上讲这是不允许的。可以想象,不能保证它在生产中有效。

我试图将 getter 包装在 [self.managedObjectContext performBlockAndWait^(void){//set here }]; block 中,但这会导致线程锁定失败。

我应该忽略该错误并继续前进,还是为此目的有更好的做法?

最佳答案

我找不到原因。我验证了 NSManagedObject 在主队列上下文中。正在询问不是主队列的队列的坐标。我所做的修复是使用代理对象作为传递给 MKMapview 的注释,而不是直接传递它。符合 MKAnnotation 协议(protocol)的 NSObject 类。使用我的 NSManagedObject 中的坐标和标题进行初始化,传递它而不是真正的交易。

关于ios - NSManagedObject 作为 MKAnnotation 和核心数据并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28075178/

相关文章:

iphone - 如何在 iOS 项目中使用 C 代码 (libqrencode)

ios - 扩展 UnicodeScalar : Creating an init method from a Character

ios - 可以在 CGContextSetRGBFillColor 中给出不同的颜色吗?

ios - 由于未捕获的异常 'NSUnknownKeyException' 而终止应用程序,原因 : '[<NSEntityDescription 0x7fc863f27230> setValue:forUndefinedKey:]

ios - swift NSSet 和核心数据

ios - Apple Instruments 在分析内存分配时会降低应用程序的速度

ios - DBAccess v1.6.2 initWithPrimaryKeyValue 返回 nil

objective-c - 如何在 iOS 中加载 XIB

objective-c - 类型类数组的问题

ios - csv 到核心数据方法错误 2012