标签: nsmanagedobject

NSManagedObject:在单独的线程上创建

我知道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

5
推荐指数
1
解决办法
1518
查看次数

是否可以在NSManagedObject中存储块?

如果可能的话,我想在核心数据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

5
推荐指数
1
解决办法
481
查看次数

NSManagedObject子类的自定义init

如何initNSManagedObject子类编写自定义代码?我想要一些类似initItemWithName:Volume:的东西.哪个ItemNSManagedObject具有两个属性的子类,namevolume.

core-data objective-c nsmanagedobject ios

5
推荐指数
1
解决办法
4999
查看次数

在Core Data中设置父子关系

我正在尝试在Core Data中建立关系.我有一个树木列表,每棵树都有一个水果列表.所以我有一个Tree实体和一个Fruit实体.

在代码中,我想在表格视图中列出树.当您单击树时,它应该显示在该树上生长的水果列表.

我如何建立这种关系?我需要提供Fruit一个名为tree的属性吗?我如何在代码中设置关系,例如当我创建一个Fruit如何将它与给定关联Tree

core-data relational-database nsmanagedobject ios

5
推荐指数
1
解决办法
2647
查看次数

如何覆盖 NSManagedObjects 的 hash 和 isEqual?

我们有一堆不同类型的 NSManagedObjects。其中一些具有其他 NSManagedObjects 的 NSSet 成员。问题是我真的需要覆盖集合中对象的哈希和 isEquals 方法 - 但它们是 NSManagedObjects。我在获取集合中的多个相同对象时遇到问题。据我所知,由于哈希默认为对象地址 - 所有对象都不同。所以我需要覆盖 hash 和 isEquals - 但看不到任何方法。

我们拥有的是系统中的一堆东西,更多的东西是通过 XML 进来的——有时是现有对象的重复。当它们相同时,我不希望将重复添加到集合中。

hash nsset nsmanagedobject ios

5
推荐指数
1
解决办法
1661
查看次数

predicateWithBlock:传递NSDictionaryMapNode

有时,当我尝试使用a NSPredicateNSFetchRequest,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.

我进一步调查了这一点,似乎每次我在第一次执行获取后都会发生这种情况,这很好.我不知道是否可能与释放有关,或者如果我使用两次,我不应该这样做.

core-data objective-c nspredicate nsmanagedobject

5
推荐指数
1
解决办法
693
查看次数

如何获取Core数据中的特定记录

我是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)

core-data nsfetchrequest nsmanagedobject ios

5
推荐指数
1
解决办法
6630
查看次数

“filename+CoreDataProperties.swift”和“filename.swift”NSmanagementObject 子类有什么用?

我最近注意到在创建 NSManagedObject 子类时创建了两个类。一种是 filename+CoreDataProperties.swift,另一种是 filename.swift。filename+CoreDataProperties.swift 与 Objective-c 中的 filename.h 和 filename.swift 与 filename.m 相似吗?如果是这样,那么我可以使用 +CoreDataProperties.swift 类将我的实现逻辑放入 filename.swift 中。

我真的无法找出这两个文件之间的区别以及它们的用途是什么?任何帮助表示赞赏

nsmanagedobject nsmanagedobjectcontext ios swift

5
推荐指数
1
解决办法
1031
查看次数

在easy init Swift 3中获取类名

我正在尝试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'

有谁知道如何解决这个错误,或以另一种方式实现相同的结果.

core-data initializer nsmanagedobject ios swift

5
推荐指数
1
解决办法
1120
查看次数

检索实体名称时崩溃?

当我的应用程序第一次启动时,我做了一些第一次设置配置,它使用 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)

sqlite xcode core-data nsmanagedobject swift-protocols

5
推荐指数
1
解决办法
777
查看次数