利用GCD进行数据持久化的方式(二)

如果各位看官看过我上一篇利用GCD持久化方式(一)那我在这里对一些相同的参数就不在做过多的介绍了,还请各位见谅.

还是按照惯例,先搞一个路径用来存储数据

NSString *path = [NSString stringWithFormat:@"%@/Documents/myData.text",NSHomeDirectory()];
    NSLog(@"   %@",path);

这里我们创建一条普通的异步线程就可以

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

然后创建dispatch_data_t

int intbuffer[] = { 1, 2, 3, 4 };
dispatch_data_t data = dispatch_data_create(intbuffer, sizeof(intbuffer), queue, NULL);

接下来我们需要搞一个信号量来监测是否完成任务

dispatch_semaphore_t sem = dispatch_semaphore_create(0);

好啦,开始写入文件

dispatch_semaphore_t sem = dispatch_semaphore_create(0);
dispatch_fd_t fd = open(strcpy(myChar, (char *)[path UTF8String]), O_RDWR | O_CREAT | O_TRUNC, S_IRWXU | S_IRWXG | S_IRWXO);
dispatch_write(fd, data, queue, ^(dispatch_data_t data, int error) {
        NSLog(@"已经写入 %zu 字节!", dispatch_data_get_size(data) - (data ? dispatch_data_get_size(data) : 0));
        dispatch_semaphore_signal(sem);
    });

然后等待完成后关闭文件描述

dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    close(fd);

以上是写入文件的操作,回调函数里面的error需要注意下,如果一切正常,写入成功的话error == 0 其他情况都是写入失败

读取操作和写入操作一样,我就直接上代码了

fd = open(strcpy(myChar, (char *)[path UTF8String]), O_RDWR);
dispatch_read(fd, 4 * sizeof(int), queue, ^(dispatch_data_t data, int error) {
        dispatch_semaphore_signal(sem);
    });

dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
close(fd);
getchar();

好啦!我目前就研究了这两种的GCD数据持久化方式,由于能力有限,目前还没有深入剖析这两种方式的具体区别,还请大神们 不吝赐教

时间: 2024-12-13 08:36:58

利用GCD进行数据持久化的方式(二)的相关文章

标准架构~业务层到底是否应该关注数据持久化的方式

业务层,你不能知道数据库的实现细节 这个话题也是网上谈论的非常多的,你的业务层是否会包含你的数据层的相关架构技术,如,你的数据层的持久化通过EF来实现,那么你的业务层是否也应该引入EntityFrameworks程序集?占占还是会告诉你,不应该,因为这样会使你的业务不再是纯粹的业务,它会依赖由你的数据层的持久化实现的技术,这是不对的,我们需要把业务层解藕出来,只有这样,你的数据层在进行技术切换时,业务层才不会受到影响,当然,这是理所当然的,如果你的数据库换技术了,还会影响到你的业务层,那么,你这

数据持久化的方式

Plist 文件:plist 文件当修改时会将原来的值给重新覆盖掉. NSUserDefaults: 存储一个用户的设置信息,比如记录用户是否是第一次启动程序.存放在 Library 下的 preferences 文件夹下. 文件读写: 文件读写是将数据保存成一个文件,存储在本地,但是只针对于四种数据类型,NSData,NSString,NSArray,NSDictionary. 归档和反归档: 可以对自定义的类来进行数据持久化存储. 数据库: 数据库来实现数据持久化存储的便利性在于可以方便的进

redis 数据持久化 aof方式

打开redis的运行目录,选择数据库2(select 2,是空集)可以看到dump.rdb的上次保存时间是今天中午1:58 添加2条数据: 再查看dump.rdb,保存时间是现在(说明从1:58到现在没有修改过key) 在dump.rdb中可以看到刚才保存进入的数据,但是当添加第三个数据addr3时,dump.rdb的修改时间是不会变的,没有达到快照备份的频率. 现在选择标号为3数据库,添加2条数据,此时还未达到快照持久化的频率,所以默认dump.rdb中还没有这两个数据,dump.rdb的修改

Android数据持久化的方式总结

一.SharedPreferences 以.xml格式的文件进行存储,存储位置在data/data/package/shared_prefs/目录下. 存储步骤: 1.创建文件:getSharedPreferences(name, mode);name为文件名,如果有此文件存在,不再创建,直接用此文件. 2.获取文件编辑器:SharedPreferences.Editor se=preferences.edit(); 3.存入数据:se.putString("et_content",

CoreData(数据持久化的方式)

// //  ViewController.m //  UI-AutoLayout. // //  Created by Bruce on 15/9/7. //  Copyright (c) 2015年 Bruce. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad

iOS -数据持久化方式-以真实项目讲解

前面已经讲解了SQLite,FMDB以及CoreData的基本操作和代码讲解(CoreData也在不断学习中,上篇博客也会不断更新中).本篇我们将讲述在实际开发中,所使用的iOS数据持久化的方式以及怎么会使用到这些方式,都会以本人实际开发的场景为例,大约需要花10-15分钟,欢迎大家指正. 一.前言 和大家说一个真实故事,前年我去美图面试(当时的技术仅仅是UI和接口的实现,并不注重很多底层实现和很多概念的原理,换句话说,就是真正的码农),过了技术第一轮和第二轮(前两年的也就是问问技术点的实现),

iOS数据持久化方式分析

iOS数据持久化的方式一般为:plist文件写入.对象归档.SQLite数据库.CoreData. plist文件写入.对象归档一般用于小的数据量. SQLite数据库.CoreData则用于大的数据量. SQLite是一款轻型的数据库,是一种关系型数据库管理系统,他的设计目的是嵌入式设备中使用. SQLite占用资源非常低,非常适合移动设备中使用,而且是开源免费的 SQLite的数据库操作其实和常规的数据库操作流程是一样的: 1.打开数据库 sqlite3_open() 2.准备SQL语句,采

docker容器实现数据持久化的两种方式及其区别

前言 这篇博文是我对docker实现数据持久化几种方式的特征进行一个总结. 在docker中,它的存储文件系统是在dockerhost上原有的xfs或ext4架设了一层文件系统:overlay2(将此行重点标注的原因就是我在面试中被问到过:docker使用的是什么文件系统?),通过docker info命令可以查看出主机上docker相关的信息,包括支持的网络类型.系统版本.内核版本.docker主机的cpu.内存等信息.如下: 在docker中实现数据持久化有两种方式:Bind mount和D

UI_19 数据持久化(本地存储)

一.数据持久化概述 数据持久化就是数据的永久存储.其本质是将数据保存为文件,存到程序的沙盒中. 1.数据持久化的方式 1.1 writeToFile:简单对象写入文件 1.2 NSUserDefaults:应用程序偏好设置1.3 Sqlite:轻量级关系型数据库,不能直接存储对象(NSData除外),需要用到一些SQL语句,先将复杂对象归档(对象->NSData) 1.4 CoreData:对象型数据库,实质是将数据库的内部存储细节封装 1.5 Plist文件 2.应用程序沙盒 每一应用程序都有