gpt4 book ai didi

ios - 如何在具有 transient 属性的 NSManagedObject 子类上实现 MKAnnotation

转载 作者:行者123 更新时间:2023-12-01 16:29:40 24 4
gpt4 key购买 nike

我在名为 Restaurant 的 NSManagedObject 子类上有以下 MKAnnotation 协议(protocol)的实现:

界面:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import <MapKit/MapKit.h>


@interface Restaurant : NSManagedObject <MKAnnotation> {
CLLocationCoordinate2D coordinate;
}

@property (nonatomic, assign) CLLocationCoordinate2D primitiveCoordinate;
@property (nonatomic, copy) NSString * title;
@property (nonatomic, copy) NSString * subtitle;
@property (nonatomic, retain) NSNumber * longtitude;
@property (nonatomic, retain) NSNumber * latitude;

@end

执行:
#import "Restaurant.h"


@implementation Restaurant

@dynamic title;
@dynamic subtitle;
@dynamic coordinate;
@dynamic longtitude;
@dynamic latitude;

-(void)setCoordinate:(CLLocationCoordinate2D)newCoordinate{
[self willChangeValueForKey:@"coordinate"];
[self setPrimitiveCoordinate:newCoordinate];
[self didChangeValueForKey:@"coordinate"];
[self setValue:[NSNumber numberWithDouble:newCoordinate.latitude] forKey:@"latitude"];
[self setValue:[NSNumber numberWithDouble:newCoordinate.longitude] forKey:@"longtitude"];
}

-(CLLocationCoordinate2D)coordinate{
[self willAccessValueForKey:@"coordinate"];
CLLocationCoordinate2D temp = [self primitiveCoordinate];
[self didAccessValueForKey:@"coordinate"];
return temp;
}

-(void)setPrimitiveCoordinate:(CLLocationCoordinate2D)primitiveCoordinate{
coordinate = primitiveCoordinate;
}

-(CLLocationCoordinate2D)primitiveCoordinate{

return coordinate;
}

-(void)awakeFromFetch{
[super awakeFromFetch];

double longtitude = [[self longtitude] doubleValue];
double latitude = [[self latitude] doubleValue];

if(!isnan(longtitude) && !isnan(latitude)){
CLLocationCoordinate2D temp = CLLocationCoordinate2DMake(latitude, longtitude);
[self setPrimitiveCoordinate:temp];
}

}

@end

我关注了苹果 Core Data programming guide关于非标准持久属性和 documentation of the MKAnnotation protocol实现 MKAnnotation 的 CLocation2DCoordinate属性作为 transient 实例变量,因为 Core Data 不支持存储 C 结构。

我的问题是:这个实现是正确的还是你会改变我的实现?也许使用 NSValue存储 C 结构而不是 NSNumber对象( latitudelongtitude )?使用 NSValue会出现哪些优缺点反而?剩下的代码呢?

谢谢!

最佳答案

像您所做的那样将坐标实现为 transient 的问题是,当您设置纬度或经度时,坐标 KVO 不会触发。因此,您最好将其实现为计算属性。您还缺少 awakeFromSnapshotEvents当您没有 keyPathsForValuesAffecting 时,当子上下文与更新了纬度或经度的餐厅一起保存时,更新坐标是必需的,keyPathsForValuesAffecting 会自动为您完成。
对于计算属性,它是:

// this means setting latitude or longitude causes coordinate KVO notification to be sent which the map is observing.
+ (NSSet<NSString *> *)keyPathsForValuesAffectingCoordinate
{
return [NSSet setWithObjects:@"latitude", @"longitude", nil];
}

- (CLLocationCoordinate2D)coordinate{
return CLLocationCoordinate2DMake(self.latitude, self.longitude);
}

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate{
self.latitude = newCoordinate.latitude;
self.longitude = newCoordinate.longitude;
}
乍一看,setCoordinate 发送过多通知似乎存在问题,但 map 实际上会在下一个运行循环中更新其注释 View ,因此这无关紧要。

关于ios - 如何在具有 transient 属性的 NSManagedObject 子类上实现 MKAnnotation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32513788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com