这是用于iOS 10+的简单但功能强大的核心数据设置。有两种访问核心数据的方法:
viewContext。将viewContext只能从主线程,并且仅被用于读取。
强大的enqueueCoreDataBlock。所有写作都应使用完成enqueueCoreDataBlock。最后无需保存,它将自动保存。所有写入都排队在operationQueue中,因此永远不会发生写入冲突。
确保切勿在另一个上下文中使用上下文中的任何ManagedObjects。还要丢弃所有创建或获取的对象,enqueueCoreDataBlock因为执行该块后,支持它们的上下文将被破坏。
// CoreDataManager.h
@interface CoreDataManager : NSObject @property (nonatomic, readonly) NSManagedObjectContext * viewContext; - (void)enqueueCoreDataBlock:(void (^)(NSManagedObjectContext* context))block; @end
// CoreDataManager.m
@implementation NSManagedObjectContext(SaveIfNeeded) -(BOOL) saveIfNeeded{ BOOL toReturn = YES; if ([self hasChanges]) { NSError *error; toReturn = [self save:&error]; if (toReturn == NO || error) { //在这里您应该登录到您的分析服务 NSLog(@"--- Failed to commit data\n error: %@", error); } } return toReturn; } @end @interface CoreDataManager () @property (nonatomic, strong) NSPersistentContainer* persistentContainer; @property (nonatomic, strong) NSOperationQueue* persistentContainerQueue; @end @implementation CoreDataManager - (id)init { self = [super init] if (self) { self.persistentContainer= [[NSPersistentContainer alloc] initWithName:@"PROJECT_NAME_ALSO_NAME_OF_MODEL" managedObjectModel:managedObjectModel]; [self.persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription * description, NSError * error) { }]; self.persistentContainer.viewContext.automaticallyMergesChangesFromParent = YES; _persistentContainerQueue = [[NSOperationQueue alloc] init]; _persistentContainerQueue.maxConcurrentOperationCount = 1; _persistentContainerQueue.name = @"persistentContainerQueue"; dispatch_queue_t queue = dispatch_queue_create("persistentContainerQueue.dispatchQueue", DISPATCH_QUEUE_SERIAL); _persistentContainerQueue.underlyingQueue = queue; } } - (void)enqueueCoreDataBlock:(void (^)(NSManagedObjectContext* context))block{ void (^blockCopy)(NSManagedObjectContext*) = [block copy]; [self.persistentContainerQueue addOperation:[NSBlockOperation blockOperationWithBlock:^{ NSManagedObjectContext* context = self.persistentContainer.newBackgroundContext; [context performBlockAndWait:^{ blockCopy(context); [context saveIfNeeded]; }]; }]]; } -(NSManagedObjectContext*) viewContext{ if (![NSThread mainThread]) { //在这里您应该登录到您的分析服务。如果您处于开发人员模式,则应崩溃以强制您解决此问题 NSLog(@"在错误的线程上访问上下文!"); } return self.persistentContainer.viewContext; }
本文向大家介绍core-data Swift 2示例,包括了core-data Swift 2示例的使用技巧和注意事项,需要的朋友参考一下 示例
#include "servlet.hpp" namespace hi{ class hello : public servlet { public: void handler(request& req, response& res) { res.headers.find("Content-Type")->second = "text/plain;charse
之前,我使用了.NETCore2.x的grpc,现在称为C-CoreGRPC,以区别于新的.NETCore3版本。我喜欢新的grpc能够从VS2019中的proto文件编译和生成客户端/服务器存根类的方式,而不是pf必须从packages文件夹中获取grpc工具,手动为C#编译它以生成客户端/服务端存根类,然后导入VS。新版本的grpc更干净。然而,在将C核grpc与asp。net核心web AP
本文向大家介绍什么是C#Asp.net Core中的Metapackage?,包括了什么是C#Asp.net Core中的Metapackage?的使用技巧和注意事项,需要的朋友参考一下 众所周知,Microsoft.AspNetCore软件包是添加到许多ASP.NET Core模板中的软件包之一。 当打开一个新的ASP.NET Core项目时,Microsoft.AspNetCore程序包将作为
本文向大家介绍什么是AddSingleton,AddScoped,Add Transient C#Asp.net Core?,包括了什么是AddSingleton,AddScoped,Add Transient C#Asp.net Core?的使用技巧和注意事项,需要的朋友参考一下 有三种方法可以在Startup.cs中注册依赖项。即AddSingleton,AddScoped和AddTransi
本文向大家介绍C / C ++中的mbrtoc16()及其示例,包括了C / C ++中的mbrtoc16()及其示例的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将讨论C ++ STL中std::mbrtoc16()函数的工作,语法和示例。 什么是std::mbrtoc16()? std::mbrtoc16()函数是C ++ STL中的内置函数,在<cuchar>头文件中定义。此函数用