当前位置: 首页 > 编程日记 > 正文

swift支持多线程操作数据库类库-CoreDataManager

类库方法

获取数据
  • executeFetchRequest(request:)

同步获取数据

    var request: NSFetchRequest = NSFetchRequest(entityName: "MonkeyEntity")var myMonkeys:NSArray? = CoreDataManager.shared.executeFetchRequest(request)

异步获取数据

  • executeFetchRequest(request:, completionHandler:)

Fetches with a completionHandler that returns an array with results asynchronously.

    var myMonkeys:NSArray?var request: NSFetchRequest = NSFetchRequest(entityName: "MonkeyEntity")CoreDataManager.shared.executeFetchRequest(request) { results inmyMonkeys = results!}
保存方法
  • save()

Saves the context, it doesn't matters the thread.

    CoreDataManager.shared.save()
删除方法
  • deleteEntity(object:)

Deletes the NSManagedObject sent

    CoreDataManager.shared.deleteEntity(item as MonkeyEntity)

源码地址:https://github.com/mdelamata/CoreDataManager-Swift

CoreDataManagaer-swift代码

 import Foundationimport CoreDataclass CoreDataManager: NSObject {let storeName="dev-db.sqlite"
let dataModelName="Model"var _managedObjectContext:NSManagedObjectContext?=nil
var _managedObjectModel:NSManagedObjectModel?=nil
var _persistentStoreCoordinator:NSPersistentStoreCoordinator?=nilclass var shared:CoreDataManager{get{struct Static{static var instance:CoreDataManager?=nilstatic var token:dispatch_once_t = 0}dispatch_once(&Static.token){Static.instance=CoreDataManager()}return Static.instance!}
}var managedObjectContext:NSManagedObjectContext{if NSThread.isMainThread(){if !(_managedObjectContext != nil){let coordinator = self.persistentStoreCoordinatorif coordinator != NSNull() {_managedObjectContext=NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)_managedObjectContext!.persistentStoreCoordinator=coordinator}return _managedObjectContext!}}else{var threadContext:NSManagedObjectContext?=NSThread.currentThread().threadDictionary["NSManagedObjectContext"] as? NSManagedObjectContext;if threadContext==nil{threadContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)threadContext!.parentContext = _managedObjectContextthreadContext!.name=NSThread.currentThread().descriptionNSThread.currentThread().threadDictionary["NSManagedObjectContext"] = threadContextNSNotificationCenter.defaultCenter().addObserver(self, selector: "contextWillSave", name: NSManagedObjectContextWillSaveNotification, object: threadContext)}else{print("using old context")}return threadContext!;}return _managedObjectContext!
}// Returns the managed object model for the application.
// If the model doesn't already exist, it is created from the application's model.
var managedObjectModel:NSManagedObjectModel{if !(_managedObjectModel != nil){let modelURL=NSBundle.mainBundle().URLForResource(dataModelName, withExtension: "momd")_managedObjectModel=NSManagedObjectModel(contentsOfURL: modelURL!)}return _managedObjectModel!
}var persistentStoreCoordinator:NSPersistentStoreCoordinator{if !(_persistentStoreCoordinator != nil){let storeURL=self.applicationDocumentsDirectory.URLByAppendingPathComponent(storeName)//var error:NSError?=nil_persistentStoreCoordinator=NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)do {try _persistentStoreCoordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: self.databaseOptions())} catch _ as NSError {//error = error1abort()}}return _persistentStoreCoordinator!;
}// #pragma mark - fetchesfunc executeFetchRequest(request:NSFetchRequest)->Array<AnyObject>?{var results:Array<AnyObject>?self.managedObjectContext.performBlockAndWait{var fetchError:NSError?do {results=try self.managedObjectContext.executeFetchRequest(request)} catch let error as NSError {fetchError = errorresults = nil} catch {fatalError()};if let error=fetchError{print("Warning!! \(error.description)")}}return results;
}func executeFetchRequest(request:NSFetchRequest,completionHandler:(results:Array<AnyObject>?) -> Void){self.managedObjectContext.performBlock(){var fetchError:NSError?var results:Array<AnyObject>?do {results=try self.managedObjectContext.executeFetchRequest(request)} catch let error as NSError {fetchError = errorresults = nil} catch {fatalError()}if let error=fetchError {print("Warning!! \(error.description)")}completionHandler(results: results)}
}func save(){let context:NSManagedObjectContext = self.managedObjectContextif context.hasChanges {context.performBlock{var saveError:NSError?let saved: Booldo {try context.save()saved = true} catch let error as NSError {saveError = errorsaved = false} catch {fatalError()};if !saved {if let error = saveError{print("Warning!! Saving error \(error.description)")}}if (context.parentContext != nil) {context.parentContext!.performBlockAndWait{var saveError:NSError?let saved: Booldo {try context.parentContext!.save()saved = true} catch let error as NSError {saveError = errorsaved = false} catch {fatalError()}if !saved{if let error = saveError{print("Warning!! Saving parent error \(error.description)")}}}}}}}func contextWillSave(notification:NSNotification){let context : NSManagedObjectContext! = notification.object as! NSManagedObjectContextlet insertedObjects:NSSet = context.insertedObjects;if insertedObjects.count != 0 {var obtainError:NSError?do {try context.obtainPermanentIDsForObjects(insertedObjects.allObjects as! [NSManagedObject])} catch let error as NSError {obtainError = error}if let error = obtainError {print("Warning!! obtaining ids error \(error.description)")}}
}func deleteEntity(object:NSManagedObject){object.managedObjectContext?.deleteObject(object)
}func deleteTable(tableName:String){let managedObjectContext=self.managedObjectContext;let entity=NSEntityDescription.entityForName(tableName, inManagedObjectContext: managedObjectContext)let request=NSFetchRequest()request.includesPropertyValues=false;request.entity=entity;let items=self.executeFetchRequest(request);if (items != nil&&items!.count>0) {for obj in items! {let item = obj as! NSManagedObject;self.deleteEntity(item)}self.save()}
}// #pragma mark - Application's Documents directory// Returns the URL to the application's Documents directory.
var applicationDocumentsDirectory: NSURL {
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)//  println(urls[urls.endIndex-1] as NSURL)return urls[urls.endIndex-1] 
}func databaseOptions() -> Dictionary <String,Bool> {var options =  Dictionary<String,Bool>()options[NSMigratePersistentStoresAutomaticallyOption] = trueoptions[NSInferMappingModelAutomaticallyOption] = truereturn options
}}

相关文章:

目标检测(或分隔)算法Mask R-CNN简介

在博文https://blog.csdn.net/fengbingchun/article/details/87195597 中对Faster R-CNN进行了简单介绍&#xff0c;这里在Faster R-CNN的基础上简单介绍下Mask R-CNN。 Mask R-CNN是faster R-CNN的扩展形式&#xff0c;能够有效地检测图像中的目标&#xff0c;并且Mask R-CNN…

未来之城,管理者可能不是人......

大会官网 https://t.csdnimg.cn/KSTh2010 年&#xff0c;IBM 正式提出了“智慧地球”愿景。在 IBM 的设想中&#xff0c;智慧城市应该由六个核心系统组成&#xff1a;组织&#xff08;人&#xff09;、业务/政务、交通、通讯、水和能源。&#xff08;图源 | IBM 官网&#xff0…

UVa 10701 - Pre, in and post

题目&#xff1a;已知树的前根序&#xff0c;中根序遍历转化成后根序遍历。 分析&#xff1a;递归&#xff0c;DS。依据定义递归求解就可以。 前根序&#xff1a;根&#xff0c;左子树&#xff0c;右子树&#xff1b; 中根序&#xff1a;左子树&#xff0c;根&#xff0c;右子树…

图像集存储成MNIST数据集格式实现

有时会用到将一组图像存放成MNIST中那样的数据格式&#xff0c;以便于用于网络的训练和测试&#xff0c;如MNSIT中的测试集标签t10k-labels.idx1-ubyte和测试集图像t10k-images.idx3-ubyte&#xff0c;各包含了10000个样本&#xff0c;这里以此两个测试集为例详细说明下实现过程…

ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案

原来定位服务是10分钟收不到定位信息就挂起定位&#xff0c;现在变为最短3分钟&#xff0c;估计都是为了省电吧。只要你开启应用的后台定位&#xff0c;并且10分钟有一次定位&#xff0c;那么苹果就不会关闭你的线程&#xff0c;现在变成3分钟。若你的应用开启了后台定位&#…

程序员必知的20个Python技巧

作者 | Duomly 译者 | 弯月&#xff0c;编辑 | 郭芮 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;Python是一门流行且应用广泛的通用编程语言&#xff0c;其应用包括数据科学、机器学习、科学计算等领域&#xff0c;以及后端Web开发、移动和桌面应用程序等方面。…

CSS float浮动的深入研究、详解及拓展(二)

为什么80%的码农都做不了架构师&#xff1f;>>> 接上回… 五、浮动的非本职工作 浮动的本职工作是让匿名inline boxes性质的文字环绕图片显示&#xff0c;而其他所有用浮动实现的效果都不是浮动应该做的事情&#xff0c;我称之为“非本职工作”。 或许我们并没有…

不需要显示地图 就获得用户当前经纬度 超简单的方法

1.遵循协议 CLLocationManagerDelegate,AMapSearchDelegate,AMapLocationManagerDelegate 2. API MAMapServices.sharedServices().apiKey APIKey AMapLocationServices.sharedServices().apiKey APIKey AMapSearchServices.sharedServices().apiKey APIKey AMapNaviService…

ELECTRA:超越BERT,2019年最佳NLP预训练模型

作者 | 李如来源 | NLPCAB&#xff08;ID:rgznai100&#xff09;【导读】BERT推出这一年来&#xff0c;除了XLNet&#xff0c;其他的改进都没带来太多惊喜&#xff0c;无非是越堆越大的模型和数据&#xff0c;以及动辄1024块TPU&#xff0c;让工程师们不知道如何落地。今天要介…

安装node和spm过程

2019独角兽企业重金招聘Python工程师标准>>> 安装nodejs 官网下载nodejs&#xff0c;我下的是v0.10.33版本&#xff0c;安装到d:\nodejs下。 1.新建目录d:\nodejs&#xff0c;在其中建立node_cache、node_global、node_modules三个目录。 2&#xff0c;将C:\Users…

经典网络LeNet-5介绍及代码测试(Caffe, MNIST, C++)

LeNet-5&#xff1a;包含7个层(layer)&#xff0c;如下图所示&#xff1a;输入层没有计算在内&#xff0c;输入图像大小为32*32*1&#xff0c;是针对灰度图进行训练和预测的。论文名字为” Gradient-Based Learning Applied to Document Recognition”&#xff0c;可以直接从ht…

根据经纬度获取用户当前位置信息

根据上篇文章获取的经纬度获取用户当前的位置信息 //获取用户所在位置信息ADDRESS func getUserAddress() { let latitude : CLLocationDegrees LATITUDES! let longitude : CLLocationDegrees LONGITUDES! print("latitude:\(latitude)") print("longitude…

刷了几千道算法题,我私藏的刷题网站都在这里了

作者 | Rocky0429 来源 | Python空间&#xff08;ID: Devtogether&#xff09;遥想当年&#xff0c;机缘巧合入了 ACM 的坑&#xff0c;周边巨擘林立&#xff0c;从此过上了"天天被虐似死狗"的生活...然而我是谁&#xff0c;我可是死狗中的战斗鸡&#xff0c;智力不够…

js实现点击li标签弹出其索引值

据说这是一道笔试题&#xff0c;以下是代码&#xff0c;没什么要文字叙述的&#xff0c;就是点击哪个<li>弹出哪个<li>的索引值即可&#xff1a; <html> <head> <style> li{width:50px;height:30px;margin:5px;float:left;text-align: center;li…

定时器开启和关闭

写程序时遇见了定时器&#xff0c;需要写入数据库用户的经纬 &#xff0c;还要读取&#xff0c;写好之后发现很费电 总结原因&#xff1a; 1&#xff1a;地图定位耗电&#xff08;这个根据程序要求&#xff0c;不能关闭&#xff0c;需要实时定位&#xff0c;很无奈&#xff…

一览群智胡健:在中国完全照搬Palantir模式,这不现实

作者 | Just出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;神秘的硅谷大数据挖掘公司 Palantir 是国内众多创业公司看齐的标杆&#xff0c;其业务是为政府和金融领域的大客户提供数据分析服务&#xff0c;帮助客户作出判断&#xff0c;甚至“预知未来”&#xff0c;…

ImageNet图像数据集介绍

ImageNet图像数据集始于2009年&#xff0c;当时李飞飞教授等在CVPR2009上发表了一篇名为《ImageNet: A Large-Scale Hierarchical Image Database》的论文&#xff0c;之后就是基于ImageNet数据集的7届ImageNet挑战赛(2010年开始)&#xff0c;2017年后&#xff0c;ImageNet由Ka…

cocos2dx 场景的切换

我们知道cocos2dx中可以由多个场景组成&#xff0c;那么我是如何来切换场景的呢首先我们先新建一个新的场景类&#xff0c;我推荐的方式是&#xff0c;在你工程的目录中找到一个classes的文件夹&#xff0c;里面有AppDelegate.cpp和AppDelegate.h还有HelloWorldScene.cpp和Hell…

IOS 后台挂起程序 当程序到后台后,继续完成定位任务

// 当应用程序掉到后台时&#xff0c;执行该方法 - (void)applicationDidEnterBackground:(UIApplication *)application { } 当一个 iOS 应用被送到后台,它的主线程会被暂停。你用 NSThread 的 detachNewThreadSelector:toTar get:withObject:类方法创建的线程也被挂起了。 我…

任正非:华为5G是瞎猫碰死老鼠

喜欢话糙理不糙的任正非&#xff0c;又飙金句。11月6日&#xff0c;在和彭博社记者对话时&#xff0c;谈到华为5G&#xff0c;他说&#xff1a;“回顾这个过程&#xff0c;我们也没有什么必胜的信心&#xff0c;有时候也是瞎猫碰上了死老鼠&#xff0c;刚好碰上世界是这个需求。…

网络文件系统(NFS)简介

网络文件系统(Network File System, NFS)是一种分布式文件系统协议&#xff0c;最初由Sun Microsystems公司开发&#xff0c;并于1984年发布。其功能旨在允许客户端主机可以像访问本地存储一样通过网络访问服务器端文件。NFS和其他许多协议一样&#xff0c;是基于开放网络运算远…

JAVA Static方法与单例模式的理解

最近用sonar测评代码质量的时候&#xff0c;发现一个问题&#xff0c;工程中一些util类&#xff0c;以前写的static方法都提示最好用单例的方式进行改正。为此&#xff0c;我仔细想了想&#xff0c;发现还是很有道理的。这里谈谈我个人对static方法与单例模式的理解。所谓单例模…

程序员的自我修养--链接、装载与库笔记:目标文件里有什么

编译器编译源代码后生成的文件叫做目标文件。目标文件从结构上讲&#xff0c;它是已经编译后的可执行文件格式&#xff0c;只是还没有经过链接的过程&#xff0c;其中可能有些符号或有些地址还没有被调整。其实它本身就是按照可执行文件格式存储的&#xff0c;只是跟真正的可执…

swift 中拨电话的实现

//MARK:_一键报警设置//MARK: - 弹出视图func createView() {var alertView : UIAlertView?alertView UIAlertView(title: "110", message: "", delegate: self, cancelButtonTitle: "取消", otherButtonTitles: "呼叫")alertView?…

T5,一个探索迁移学习边界的模型

作者 | Ajit Rajasekharan译者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】10月&#xff0c;Google 在《Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer》这篇论文中提出了一个最新的预训练模型 T5&#xff…

【Chat】实验 -- 实现 C/C++下TCP, 服务器/客户端 多人聊天室

本次实验利用TCP/IP, 语言环境为 C/C 利用套接字Socket编程&#xff0c;以及线程处理&#xff0c; 实现Server/CLient 之间多人的聊天系统的基本功能。 结果大致如&#xff1a; 下面贴上代码&#xff08;参考参考...) Server 部分&#xff1a; 1 /* TCPdtd.cpp - main, TCPdayt…

TeamViewer介绍:远程控制计算机

TeamViewer是一个可以远程控制计算机的程序&#xff0c;它也可以进行远程文件传输。TeamViewer支持的平台比较多&#xff0c;如Windows, Mac, Linux, ChromeOs, Android, iOS等&#xff0c;最新发布版本为14.x&#xff0c;它有个人免费和商业付费两种。只要对方告诉你他的TeamV…

PyTorch攻势凶猛,程序员正在抛弃TensorFlow?

来源 | The Gradient译者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;自 2012 年深度学习重新获得重视以来&#xff0c;许多机器学习框架便争相成为研究人员和行业从业人员的新宠。从早期的学术成果 Caffe 和 Theano &#xff0c;到背靠庞大工业支持的 PyT…

swift 错误集合 ------持续更新中

从今天开始凡是在用swift中遇到的错误都会在本博客持续更新 便于自己学习和快速开发 2017.7.20 如果你的程序写的有进入后台的方法&#xff0c;例如我的博客中点击home进入后台持续定位的那篇文章&#xff0c;发信进入后台后定位没有按得定时器规定的时间走&#xff0c;这…

【转载】【贪心】各种覆盖问题

1、独立区间问题 在N个区间里找出最多的互不覆盖的区间 对结束点进行排序&#xff0c;然后从结束点最小的区间开始进行选择即可 2、覆盖区间问题 给一个大区间&#xff0c;再给出N个小区间&#xff0c;求出最少用多少个区间可以把大区间覆盖完 先选出开始的一个&#xff0c;然后…