我知道Core Data不是线程安全的,并且与上下文关联的NSManagedObjectContext和NSManagedObjects不能从线程传递给线程.
但是,如果我的主线程上有NSManagedObjectContext,我可以在后台线程上创建一个NSManagedObject对象(没有将它附加到任何上下文 - 也就是说,只需在NSManagedObject上调用alloc/init),然后将该NSManagedObject传递回主线程并将其添加到上下文中?我已经查看了有关Core Data并发性的文档,但找不到任何说这种使用模式没问题的文档.
我有一个后台线程执行复杂的任务然后发布结果.结果是一个NSManagedObject子类,它包含一些属性:time,文件路径和成功或错误消息(作为字符串).我想在后台线程上创建结果对象,然后将其抛回主线程并将其添加到Core Data上下文中,它将在tableView中显示.
如果我无法在后台线程上创建managedObject,那么我需要创建一个字典,将字典传递给主线程,读取键,从这些值创建managedObject等等.如果可能的话,在后台线程上使用managedObject.
cocoa core-data objective-c nsmanagedobject nsmanagedobjectcontext
如果可能的话,我想在核心数据NSManagedObject中保留一个块.我有一个来自NSManagedObject的继承类.这个类有一个块来满足一些异步调用.我试图将块存储为Transformable和Transient属性.当我在加载NSManagedObject之前尝试调用块时,我的内存访问不正确"EXC_BAD_ACCESS".
如果我不检查可转换标志,我有一个类似于此的异常:
-[__NSStackBlock__ encodeWithCoder:]: unrecognized selector sent to instance 0xbfffd930
Run Code Online (Sandbox Code Playgroud)
我是iOS的新手.我在支持ARC的iOS 5 SDK下工作.这是我的代码摘录:
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class ModbusRegister, Board;
typedef void (^DataBlockType)(NSArray *listRegister);
@interface EnergyEntry : NSManagedObject
- (void)invokeWithData: (NSArray *)listRegister;
@property (nonatomic, copy) DataBlockType datablock;
@end
#import "EnergyEntry.h"
@implementation EnergyEntry
@dynamic datablock;
- (void)invokeWithData: (NSArray *)listRegister{
self.datablock(listRegister);
}
@end
Run Code Online (Sandbox Code Playgroud)
当我试图存储块时:
[energyEntry setValue:@"Energía activa" forKey:@"name"];
[energyEntry setValue:[NSNumber numberWithDouble:0] forKey:@"value"];
[energyEntry setValue:currentBoard forKey:@"board"];
[energyEntry setValue:^(NSArray *listRegister){
//...my block operations to store
} forKey:@"datablock"];
Run Code Online (Sandbox Code Playgroud)
最后,当我调用块并触发错误时:
NSArray *listRegister=... //my ready …Run Code Online (Sandbox Code Playgroud) nsmanagedobject ios objective-c-blocks automatic-ref-counting
如何init为NSManagedObject子类编写自定义代码?我想要一些类似initItemWithName:Volume:的东西.哪个Item是NSManagedObject具有两个属性的子类,name和volume.
我正在尝试在Core Data中建立关系.我有一个树木列表,每棵树都有一个水果列表.所以我有一个Tree实体和一个Fruit实体.
在代码中,我想在表格视图中列出树.当您单击树时,它应该显示在该树上生长的水果列表.
我如何建立这种关系?我需要提供Fruit一个名为tree的属性吗?我如何在代码中设置关系,例如当我创建一个Fruit如何将它与给定关联Tree?
我们有一堆不同类型的 NSManagedObjects。其中一些具有其他 NSManagedObjects 的 NSSet 成员。问题是我真的需要覆盖集合中对象的哈希和 isEquals 方法 - 但它们是 NSManagedObjects。我在获取集合中的多个相同对象时遇到问题。据我所知,由于哈希默认为对象地址 - 所有对象都不同。所以我需要覆盖 hash 和 isEquals - 但看不到任何方法。
我们拥有的是系统中的一堆东西,更多的东西是通过 XML 进来的——有时是现有对象的重复。当它们相同时,我不希望将重复添加到集合中。
有时,当我尝试使用a NSPredicate时NSFetchRequest,evaluatedObject它传递给块是其中一个nil或一个实例NSDictionaryMapNode,似乎没有人听说过.
显然这是有问题的,因为NSDictionaryMapNode它不是公共API的一部分,并且没有我需要用于谓词的有用方法.
这是一个非常简单的例子:
fetchRequest.predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
NSLog(@"%@", NSStringFromClass([evaluatedObject class]);
return YES;
}];
Run Code Online (Sandbox Code Playgroud)
在这里,我希望evaluatedObject是一个子类的实例NSManagedObject,但它是一个实例NSDictionaryMapNode.
我进一步调查了这一点,似乎每次我在第一次执行获取后都会发生这种情况,这很好.我不知道是否可能与释放有关,或者如果我使用两次,我不应该这样做.
我是iOS开发的新出价.我正在使用NSManagedObject of Core Data来执行Insert和Fetch操作.它工作得很好.但问题是,我想从表中只获取一些选定的记录(在MySQL中的条件).例如"从city ='Pune'的用户中选择名称"; 我找到了NSPredicate来获取过滤后的数据.但它提供了数组中的所有数据,而不仅仅是所选数据.例如,如果以上查询的结果是:
Anu
Run Code Online (Sandbox Code Playgroud)
然后NSPredicate结果将给出:
fname = Anu
lname = Padhye
city = Pune
id = 3
Run Code Online (Sandbox Code Playgroud)
有没有办法只在iOS Objective-c中获取所选的记录?以下是我用于NSManagedObject的代码片段:
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"User"];
valueData = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];
NSEntityDescription *productEntity=[NSEntityDescription entityForName:@"User" inManagedObjectContext:managedObjectContext];
NSFetchRequest *fetch=[[NSFetchRequest alloc] init];
[fetch setEntity:productEntity];
NSPredicate *p=[NSPredicate predicateWithFormat:@"id == %d", 3];
[fetch setPredicate:p];
//... add sorts if you want them
NSError *fetchError;
NSArray *fetchedProducts=[valueData filteredArrayUsingPredicate:p];
Run Code Online (Sandbox Code Playgroud) 我最近注意到在创建 NSManagedObject 子类时创建了两个类。一种是 filename+CoreDataProperties.swift,另一种是 filename.swift。filename+CoreDataProperties.swift 与 Objective-c 中的 filename.h 和 filename.swift 与 filename.m 相似吗?如果是这样,那么我可以使用 +CoreDataProperties.swift 类将我的实现逻辑放入 filename.swift 中。
我真的无法找出这两个文件之间的区别以及它们的用途是什么?任何帮助表示赞赏
我正在尝试convenience init(context moc: NSManagedObjectContext)在iOS 10中实现我自己的版本,NSManagedObject上的新便捷初始化器.原因是我需要使它与iOS 9兼容.
我想出来了:
convenience init(managedObjectContext moc: NSManagedObjectContext) {
let name = "\(self)".components(separatedBy: ".").first ?? ""
guard let entityDescription = NSEntityDescription.entity(forEntityName: name, in: moc) else {
fatalError("Unable to create entity description with \(name)")
}
self.init(entity: entityDescription, insertInto: moc)
}
Run Code Online (Sandbox Code Playgroud)
但由于这个错误它不起作用......
在self.init电话之前使用'self'
有谁知道如何解决这个错误,或以另一种方式实现相同的结果.
当我的应用程序第一次启动时,我做了一些第一次设置配置,它使用 CoreData API 和来自 JSON 文档的数据为我的 SQLLite 数据库做种。
为此,我首先从核心数据堆栈获取对托管对象上下文的引用,然后调用执行 JSON 配置的方法。然后我打电话:
....(JSON conversion)....
context.perform {
_ = Exercise.insert(into: context, name: exerciseName, category: categoryNumber, equipment: equipment, skill: "", primaryMuscle: primaryMuscle, otherMuscles: otherMuscles, info: exerciseDescription, image1: exerciseImage1, image2: exerciseImage2)
}
Run Code Online (Sandbox Code Playgroud)
在我循环遍历 JSON 对象时的每次迭代中,它都会保留每个对象。
插入对象的方法是这样的:
public static func insert(into context: NSManagedObjectContext, name: String, category: Int16, equipment: String?, skill: String?, primaryMuscle: String?, otherMuscles: String?, info: String?, image1: String?, image2: String?) -> Exercise {
let exercise: Exercise = context.insertObject()
exercise.name = name
exercise.category = category …Run Code Online (Sandbox Code Playgroud) nsmanagedobject ×10
core-data ×7
ios ×7
objective-c ×3
swift ×2
cocoa ×1
hash ×1
initializer ×1
nspredicate ×1
nsset ×1
sqlite ×1
xcode ×1