我最近注意到在创建 NSManagedObject 子类时创建了两个类。一种是 filename+CoreDataProperties.swift,另一种是 filename.swift。filename+CoreDataProperties.swift 与 Objective-c 中的 filename.h 和 filename.swift 与 filename.m 相似吗?如果是这样,那么我可以使用 +CoreDataProperties.swift 类将我的实现逻辑放入 filename.swift 中。
我真的无法找出这两个文件之间的区别以及它们的用途是什么?任何帮助表示赞赏
我正在尝试有效地批量删除大量NSManagedObjects (不使用NSBatchDeleteRequest)。我一直遵循这个答案中的一般过程(适用于 Swift),通过批处理请求对象、删除、保存然后重置上下文的操作。我的获取请求设置includesPropertyValues为false.
然而,当它运行时,当每个对象从上下文中删除时,错误就会被触发。添加日志记录如下:
// Fetch one object without property values
let f = NSFetchRequest<NSManagedObject>(entityName: "Entity")
f.includesPropertyValues = false
f.fetchLimit = 1
// Get the result from the fetch. This will be a fault
let firstEntity = try! context.fetch(f).first!
// Delete the object, watch whether the object is a fault before and after
print("pre-delete object is fault: \(firstEntity.isFault)")
context.delete(firstEntity)
print("post-delete object is fault: \(firstEntity.isFault)")
Run Code Online (Sandbox Code Playgroud)
产生输出:
pre-delete object is fault: true …
使用 CoreData,您可以要求容器使用container.newBackgroundContext().
这对于在后台使用核心数据而不影响 UI 主上下文非常有用。
您还可以使用以下命令创建子上下文privateQueueConcurrencyType
let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果我没有错的话,上下文仍将在不同队列的后台执行。
那么两者之间有什么区别以及何时使用其中一种和另一种呢?
我有一个简单的核心数据实体Story,偶尔会使用网络调用中的最新数据进行更新。此网络调用有时会更新很多很多故事实例,因此我运行一个NSBatchInsertRequest,如下所示。(我使用批量插入的另一个原因是可能需要将许多故事添加到持久存储中。)
问题是用户可能已经将 a 标记Story为收藏夹。当他们这样做时,我设置story.isFavorite = true主线程并保存viewContext。
但是,当发生批量插入时,它会覆盖story.isFavorite,将其设置回false,即使我NSMergeByPropertyObjectTrumpMergePolicy同时在批量插入和视图上下文中使用。我也没有接触story.isFavorite批量插入处理程序,因此我不希望该属性被覆盖。
我认为使用此合并策略进行批量插入的好处是避免首先获取+然后手动更新更改的属性+最后保存。避免更改 中的属性值的正确方法是什么NSBatchInsertRequest?
@objc(Story)
public class Story: NSManagedObject {
@NSManaged public var title: String?
@NSManaged public var storyURL: URL?
@NSManaged public var updatedTime: Date?
@NSManaged public var isFavorite: Bool // <- the problem property
}
Run Code Online (Sandbox Code Playgroud)
container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
container.viewContext.automaticallyMergesChangesFromParent = false
let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
context.parent = container.viewContext
context.mergePolicy = …Run Code Online (Sandbox Code Playgroud) core-data nsfetchedresultscontroller nsfetchrequest nsmanagedobject nsmanagedobjectcontext
我有一个基于实用程序模板的应用程序(在那里翻转视图以查看另一个).在第一个视图上有一个登录屏幕,然后翻转以显示UITabBar样式界面.
我无法解决如何从App Delegate(创建它)一直传递给每个Tab Bar的视图的managedObjectContext.
App Delegate的managedObjectContext传递给FrontLoginViewController,它传递给BackViewTabBarViewController ..接下来呢?
BackViewTabBarViewController nib有一个UITabBarController,每个选项卡都有一个UINavigationController.
iphone core-data uitabbarcontroller nsmanagedobjectcontext ios
我有一个架构问题.我的应用程序在应用程序窗口中使用TabBarController.ApplicationDelegate创建managedObjectContext,虽然它实际上不需要它.
TabBarController中的每个ViewController都是一个NavigationViewController.每个NavigationController的第一个视图控制器是我的自定义视图.所有都是通过Interface Builder创建链接.
现在,如何以正确的方式传递managedObjectContext?实际上我需要我的视图尽快加载数据,以便当用户选择选项卡或浏览NavigationControllers时,数据已经存在.
所以我的问题是:
感谢所有的想法!
iphone core-data uitabbarcontroller ipad nsmanagedobjectcontext
在苹果"并发核心数据"的文件规定使用的核心数据与后台线程讨论时以下.
保存在后台线程中容易出错
异步队列和线程不会阻止应用程序退出.(具体来说,所有基于NSThread的线程都是"分离的" - 请参阅pthread的文档以获取完整的详细信息 - 并且只有在所有未分离的线程都退出之后才会运行.)
特别是:
如果需要保存在后台线程上,则必须编写其他代码,以便主线程阻止应用程序退出,直到完成所有保存操作.
在IOS应用程序中实现此目的的推荐方法是什么?
我试图从ios应用程序中的核心数据库中删除行但它不起作用,
if (editingStyle == UITableViewCellEditingStyleDelete) {
appDelegate = [[UIApplication sharedApplication] delegate];
NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"PRODUCTTABLE" inManagedObjectContext:appDelegate.managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entityDesc];
NSError *error;
NSManagedObject *matches = nil;
NSArray *objects = [appDelegate.managedObjectContext executeFetchRequest:request error:&error];
NSLog(@"Array Count....%d",[objects count]);
matches=[objects objectAtIndex:([indexPath row])];
NSLog(@"...%@",[matches valueForKey:@"productID"]);
NSLog(@"...%@",[matches valueForKey:@"pName"]);
NSLog(@"...%@",[matches valueForKey:@"pPrice"]);
NSLog(@"...%@",[matches valueForKey:@"pDate"]);
[appDelegate.managedObjectContext deleteObject:matches];
}
Run Code Online (Sandbox Code Playgroud)
以下代码的o/p:
Array Count....12
...ABC1226
...ABC-005
...599.39
...2012-08-09 05:07:50 +0000
Run Code Online (Sandbox Code Playgroud)
我从相同的NSManagedObject获取核心数据的数据.为什么删除不更新核心数据?
保存时出现以下错误managedObjectContext:
Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[Image count]: unrecognized selector sent to instance
Run Code Online (Sandbox Code Playgroud)
码:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)selectedImage editingInfo:(NSDictionary *)editingInfo {
// Delete any existing image.
Image *oldImage = _place.image;
if (oldImage != nil) {
[_place.managedObjectContext deleteObject:oldImage];
}
Image *image = [NSEntityDescription insertNewObjectForEntityForName:@"Image" inManagedObjectContext:_place.managedObjectContext];
image.imageData = UIImageJPEGRepresentation(selectedImage, 0.5);
_place.image = image;
[_place.managedObjectContext save:nil]; //Here is the crash
[self dismissViewControllerAnimated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)
Image实体有两个一对一的关系:place和trip.
@interface Image : NSManagedObject
@property (nonatomic, retain) NSData …Run Code Online (Sandbox Code Playgroud) 我有两个类:Profile和Config.配置文件包含NSSet的Config对象.Profile和Config都是NSManagedObject子类.
@interface Profile : NSManagedObject
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSSet *configs;
- (void)print;
@end
Run Code Online (Sandbox Code Playgroud)
这是Config类
@interface Config : NSManagedObject
@property (nonatomic, retain) NSString * otherdata;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSMutableDictionary *myDict;
@property (nonatomic, retain) Profile *profile;
- (void)print;
@end
Run Code Online (Sandbox Code Playgroud)
字典myDict有NSString*键和值.现在当我对myDict进行任何更改时,我调用了NSManagedObjectsave方法,并且没有任何错误.只要我不杀死应用程序,一切都按预期运行.
但是当我强制杀死应用程序时(无论是在Xcode中还是通过双击主页按钮并在底部的按钮行中将其删除)然后重新启动应用程序,myDict中的数据将恢复为之前的状态,即新的数据实际上没有保存.它似乎只是在我杀死应用程序之前保存.
myDict在xcdatamodeld文件中列为Transformable.我没有指定任何NSTransformer课程就试过了.我也尝试过指定一个变换器类MyDictTransformer,在Config中我添加了这段代码:
在Config.h中:
@interface MyDictTransformer : NSValueTransformer
@end
Run Code Online (Sandbox Code Playgroud)
在Config.m中:
@implementation MyDictTransformer
+ (Class)transformedValueClass
{
return [NSMutableDictionary class];
}
+ (BOOL)allowsReverseTransformation
{
return …Run Code Online (Sandbox Code Playgroud)