我正在尝试了解 iOS Core 数据瞬态属性,但在理解某些行为时遇到了麻烦。
设置
我有两个上下文,一个主上下文和一个私有上下文。我称它们为 mainContext 和 threadedContext 。
线程上下文是父上下文,主上下文是子上下文。(我这样做是因为我的线程上下文比我的主线程和 UI 更频繁地更改模型。
我有需要通过上下文传递的值的瞬态属性。
我发现有时我失去了价值,有时我不依赖于我如何运行。
样本
此代码已被简化以显示问题。我有一个 Person 对象。Person 对象有一个名为“other”的瞬态实体,您将看到我为其分配了一个 Other 对象,该对象具有几个简单的属性,仅此而已。
- (void)case1
{
NSManagedObjectContext *mainThreadContext = [AppDelegate appDelegate].mainThreadContext;
NSManagedObjectContext *threadedContext = [AppDelegate appDelegate].threadedContext;
__block NSManagedObjectID *objectID = nil;
[mainThreadContext performBlockAndWait:^{
//create
Person *aPerson = [self createAPersonOnContext:mainThreadContext];
//setup
Other *other = [[Other alloc] init];
aPerson.other = other;
aPerson.other.favoriteColor = @"Blue";
aPerson.other.city = @"Provo";
//save
NSError *error = nil;
[mainThreadContext save:&error];
objectID = aPerson.objectID;
NSLog(@"%@",aPerson);
}];
}
Run Code Online (Sandbox Code Playgroud)
当我像这样检索对象时,仍然设置了 person.other 属性(请注意,我在检索对象后正在保存: …
我有一个名为“国家”的核心数据实体。该实体有一个名为 nameOfCountry 的字段,其中包含英语国家/地区名称。我需要将其本地化为其他语言,因此我创建了一个名为 nameOfCountryLocalized 的临时属性。
在国家类中,我正在导入此类别
国家+NameOfCountryLocalized.h
#import "Countries.h"
@interface Countries (NameOfCountryLocalized)
@property (nonatomic, strong) NSString * nameOfCountryLocalized;
@end
Run Code Online (Sandbox Code Playgroud)
国家+NameOfCountryLocalized.m
#import "Countries+NameOfCountryLocalized.h"
#import "Countries.h"
@implementation Countries (NameOfCountryLocalized)
@dynamic nameOfCountryLocalized;
-(NSString *) nameOfCountryLocalized {
[self willAccessValueForKey:@"nameOfCountryLocalized"];
NSString *nameLocalized = NSLocalizedString(self.nomePais, nil);
[self didAccessValueForKey:@"nameOfCountryLocalized"];
return nomeLocalizado;
}
-(void)setNameOfCountryLocalized:(NSString *) nameLocalized {
[self willChangeValueForKey:@"nameOfCountryLocalized"];
[self setNomePaisLocalizado:];
[self didChangeValueForKey:@"nameOfCountryLocalized"];
}
@end
Run Code Online (Sandbox Code Playgroud)
当我尝试使用 tableViewController 访问 nameOfCountryLocalized 时
- (NSFetchedResultsController *)fetchedResultsController {
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; …Run Code Online (Sandbox Code Playgroud) cocoa-touch core-data nsfetchedresultscontroller nsmanagedobject ios
我在 userDefaults 中保存 NSManagedObject 有困难,我想知道 a) 我应该尝试这样做还是这不是一种合适的方法,或者 b) 如果它是一种合适的方法,我怎样才能让它工作?
我正在用 Swift 2.3 编写我的应用程序,它有一些用户默认选项,其中一个用于默认“提升”(如举重,例如“卧推”、“挺举”、“倾斜卧推” )。我实际上将它们从枚举转换为核心数据实体,因为用户能够跟踪的每个电梯事件都将是可用的电梯类型之一(我将为其建立适当的关系)。
这是具有属性的扩展:
extension Lift {
@NSManaged var liftName: String
@NSManaged var type: NSSet
}
Run Code Online (Sandbox Code Playgroud)
以及带有 Xcode 抱怨的 Lift 实体:
class Lift: NSManagedObject, NSCoding {
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(liftName, forKey: "liftName")
} // Super.init isn't called on all paths before returning from initializer
required init(coder aDecoder: NSCoder) {
// Initialization of immutable variable was never used, etc...
let liftName = aDecoder.decodeObjectForKey("liftName") as! String
}
}
Run Code Online (Sandbox Code Playgroud)
我以前处理过这些类型的错误,所以我真正关心的是我是否走上了错误的道路。
今晚我读了很多线程,这些线程告诉我我需要对一个对象(但不是特别是 …
我NSManagedObjectContext在我的 iOS 应用程序中使用 child 作为便签本。我正在使用 的扩展NSManagedObjectContext来创建子上下文,如下所示:
extension NSManagedObjectContext {
func childContext(concurrencyType: NSManagedObjectContextConcurrencyType = .mainQueueConcurrencyType) -> NSManagedObjectContext {
let childContext = NSManagedObjectContext(concurrencyType: concurrencyType)
childContext.parent = self
return childContext
}
}
Run Code Online (Sandbox Code Playgroud)
NSManagedObject当将新的内容插入新的子上下文(从viewContexta创建NSPersistentContainer)时,我的应用程序的一部分重复出现错误,并显示以下消息:
CoreData:错误:从上下文中删除托管对象后对其进行更改
这很奇怪,因为应用程序的其他部分(也使用子上下文)运行良好。NSManagedObject最终,我将原因缩小到将新的(实体名称“Book”)插入新的子上下文的方式上的一个小差异。以下内容按预期工作:
let childContext = container.viewContext.childContext()
let object1 = NSEntityDescription.insertNewObject(forEntityName: "Book", into: childContext)
print(object1.managedObjectContext == nil)
// prints "false"
Run Code Online (Sandbox Code Playgroud)
但是,如果我内联创建子上下文(即未分配给变量,则托管对象不会插入到上下文中):
let object2 = NSEntityDescription.insertNewObject(forEntityName: "Book", into: container.viewContext.childContext())
print(object2.managedObjectContext == nil)
// prints "true"
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很奇怪并且无法弄清楚。一切都在主线程上运行。我还创建了一个Swift …
我正在阅读删除/重置 Core Data 中的所有条目?.
如果我按照以下步骤操作,会得到意想不到的结果:
clearCoreDataStore再次调用(或重新启动),则不会从核心数据中检索该值我错过了什么?
func clearCoreDataStore() {
let entities = dataManager.persistentContainer.managedObjectModel.entities
for entity in entities {
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity.name!)
let deleteReqest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try context.execute(deleteReqest)
} catch {
print(error)
}
}
dataManager.saveContext()
}
Run Code Online (Sandbox Code Playgroud) core-data nsmanagedobject nsmanagedobjectcontext ios nsbatchdeleterequest
我想在对象上添加一个方法(从NSManagedObject子类化)
@interface REMBox : NSManagedObject {
}
- (int)singleValueForIndex:(int)index;
@property (nonatomic,retain) NSString *name;
Run Code Online (Sandbox Code Playgroud)
但该方法不能使用
REMBox *box = ....
BOOL canCallMessage = [box respondsToSelector:@selector(singleValueForIndex:)];
// canCallMessage is NO
int a = [box singleValueForIndex:4];
// that crashes :-(
Run Code Online (Sandbox Code Playgroud)
我的错是什么 REMBox的正常(核心数据)属性运行良好.
假设我已经检索了一个托管对象数组(一个Car对象数组).让我们说a Car有像make和的属性model.Cars目前在NSArray.
如何查找所有具有属性honda值的汽车make?
我正在尝试创建一个应用程序,用户可以在其中编辑managedObject视图中的a 属性,并选择Done保留更改或Cancel撤消更改.
为了实现这种行为,我打算做以下事情 -
managedObject,创建一个backupManagedObject原始的克隆managedObject.backupManagedObject是在单独的子ManagedObjectContext中创建的.managedObject.Done按下,原始文件managedObject被保留,备份被删除Cancel按下,将backupManagedObject其克隆为原始文件managedObject并删除备份我的问题是,一旦我完成了backupManagedObject,我怎么能删除childManagedObjectContext哪个将没有更多的托管对象,我不打算再使用它们(对于每个新的视图控制器,我打算只创建一个新的子托管对象上下文并在视图控制器完成后将其销毁).
core-data objective-c nsmanagedobject nsmanagedobjectcontext ios
我想知道如何在下面为我的CoreData NSManagedObject客户端创建一个类别的等价物:
我知道扩展现在是Swift中类别的替代 - 但不确定它们的实现.以下是我在下面扣除的内容:
class Client: NSManagedObject {
@NSManaged var name: String
@NSManaged var projects: NSSet
}
extension Client {
func addClientWithName(name:NSString, context:NSManagedObjectContext) -> Client {
var client:Client = Client();
// Check for name in the database already exists
let request:NSFetchRequest = NSFetchRequest(entityName: "Client")
let sortDescriptor:NSSortDescriptor = NSSortDescriptor(key: "name", ascending: true)
let sortDescriptorsAry:NSArray = [sortDescriptor]
request.sortDescriptors = sortDescriptorsAry
request.predicate = NSPredicate(format: "name = %@", name)
var error:NSError?
let matches:NSArray = context.executeFetchRequest(request, error: &error)
if matches.count == 0 {
//Add …Run Code Online (Sandbox Code Playgroud) 我正在尝试从保存在用户默认值中的NSURL中检索和创建托管对象,但我无法弄清楚如何使用managedObjectIDForURIRepresentation函数.我的代码看起来像这样:
func setCoreData(){
let defaults = NSUserDefaults.standardUserDefaults()
let usedKeyName = "timerList"
let usedList = defaults.objectForKey(usedKeyName) as? [NSURL] ?? []
let url:NSURL = usedList[0] as NSURL
let managedobject:NSManagedObjectID = //What do I write here?
}
Run Code Online (Sandbox Code Playgroud)
任何建议,将不胜感激.
core-data ×10
nsmanagedobject ×10
ios ×9
swift ×4
objective-c ×2
cocoa ×1
cocoa-touch ×1
iphone ×1
nspredicate ×1