UI:文件操作、通知中心
对文件的操作:
#define PATH @"/Users/mac/Desktop/未命名文件夹"
#define ERROR(a) if(a){NSLog(@"%@",a);}
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) {
/*
@autoreleasepool {
//创建一个单例对象
NSFileManager * fileManage = [NSFileManager defaultManager];
NSError * error = nil;
//注意传的是指针的地址,是个** 类型的数据
//这里是浅度遍历只把路径下的文件夹的名字
NSArray * arrary = [fileManage contentsOfDirectoryAtPath:PATH error:&error];
if (error) {
//这里文件操作为什么一定要要报错呢?
NSLog(@"浅度遍历扑获错误%@",error);
exit(-1);
}
NSLog(@"浅度遍%@",arrary);
//这里是深度遍历只把路径下的文件夹以及子文件夹下的所有子文件夹的名字
arrary = [fileManage subpathsOfDirectoryAtPath:PATH error:&error];
if (error) {
NSLog(@"深度遍历%@",error);
exit(-1);
}
NSLog(@"深度遍历%@",arrary); //创建目录
//方法的第一个参数:拼接要创建的目录的路径
//第二个参数:表示是否创建中间目录。YES 就是补全中间目录的意思。如果是 YES 那么第一个参数中如果没有中间路径就会报错,有就不会报错,如果是 NO 那么没有中间路径就会报错,没有就不会报错
//第三个参数:可以为空
[fileManage createDirectoryAtPath:[NSString stringWithFormat:@"%@/middle/dir",PATH] withIntermediateDirectories:YES attributes:nil error:&error];
if (error) {
NSLog(@"创建目录_>错误捕获%@",error);
exit(-1);
} //创建一个文件夹
//首先还是要获取一个文件路径
//第一个参数:就是创建的文件夹所在的目标路径 第二个参数:文件的内容,我们也可以在创建的时候不写入内容,之后再写入内容。是一个NAData类型的数据,我们把字符串转化为NSData类型这里用到的方法是[字符串 NSTF8StringEncoding] 第三个参数:文件夹的属性,这里为nil就是使用默认的属性
[fileManage createFileAtPath:[NSString stringWithFormat:@"%@/middle/dir/file",PATH] contents:[@"I am an chinese" dataUsingEncoding:NSUTF8StringEncoding]attributes:nil];
}
*/ //文件的删除操作
@autoreleasepool {
NSFileManager * filemanage = [NSFileManager defaultManager];
NSError * error = nil;
//第一个参数:不管是目录还是文件都可以进行删除
[filemanage removeItemAtPath:[NSString stringWithFormat:@"%@/middle",PATH] error:&error];
ERROR(error);
NSArray * arrPaht = [filemanage contentsOfDirectoryAtPath:PATH error:nil];
ERROR(error);
NSLog(@"文件删除后的遍历操作%@",arrPaht);
//文件的移动、拷贝 就是把对应的方法名字removeItemAtPath: 的remove 改为 move 、dele 、copy
//文件的拷贝
[filemanage copyItemAtPath:[NSString stringWithFormat:@"%@/NSFlieManage",PATH] toPath:[NSString stringWithFormat:@"%@/NSFlieManage2",PATH] error:&error];
NSArray * arrPaht2 = [filemanage contentsOfDirectoryAtPath:PATH error:nil];
NSLog(@"拷贝后的文件%@",arrPaht2);
//将目标1的文件移动到目标2的文件夹下,保持名字不变的操作
[filemanage moveItemAtPath:[NSString stringWithFormat:@"%@/NSFlieManage2",PATH] toPath:[NSString stringWithFormat:@"%@/NSFlieManage/NSFlieManage2",PATH] error:&error];
NSArray * arrPaht3 = [filemanage contentsOfDirectoryAtPath:PATH error:nil];
NSLog(@"移动后的文件%@",arrPaht3); }
return ;
}
NSFileManage类
对文件内容的操作:
文件操作
NSHandle 类文件句柄
打开一个句柄,这个句柄就是这个文件的代表。
对文件的读和写,从文件句柄中读,就是从文件中读,从文件句柄中写,就是从文件中写。
对于读和写都是对于CPU来说的,对于CPU来讲内存就是内部存储器,硬盘就是外部存储器,从硬盘到内存到CPU叫做读,从内存到硬盘叫叫做写。内部存储器(内存)相当于大脑,外部存储器(硬盘)相当于书本。
创建一个文件句柄,文件句柄是靠打开文件来创建的。下面是以制度方式创建的文件句柄
NSfileHandle * hf = [NSFleHanndle fileHandleForReadingAtPath:要打开文件的路径];
读指定的字节以二进制的形式读(NSData类型的数据)
NSData * data = [hf readDataOfLength:];
//d读指针的偏移,每次读的都会接着上一次读的进行偏移,就像人用手指指着文字进行读书一样
data = [fh readDataOFLength:];//这里会接着上一次的进度继续的读取数据
NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@“%@”,str);
如果文件的内容不是很多,我们可以直接读取到文件的结尾,使用的方法是:
NSData * data2 = [fh readDataToEdndfFile];//直接读取到文件的结尾,这里还是从指针位置为0开始读取,一直到最后 文件的写入:
以只写的方式打开文件句柄
NSFileHandle * fh = [NSFileHandle fileHandleForWritingAtPAth:要写入文件的地址];
[fh writeData:[要写入的内容 dataUsingEncoding:NSUTF8StrinngEncoding]];
下面的方法是,将文件的内容截止到几个字节,然后再写入内容
[fh truncateFileAtoffset:];//将原来的文件保留前5个字节
[fh writeData:[要写入的文件内容 dataUsingEncoding:NSUTF8StringEncoding]];
将文件内容写到原文件的后面,就是追加到原来文件内容的后面 的方法:
[fh seekToEndOfFil];//将读写指针设在文件的末端
[fh writeData[要写入的文件的内容 dataUsingEncodinng:NSTF8StringEncoding]];
NSFileHandle类
通知中心 Notificaton:
通知中心 NSNotification
什么是通知中心:
通知中心就是广播设计模式,是一种设计模式。我们在项目中多个对象之间需要通信,就可以使用通知中心。也可以说通知中心是单例
使用场景:
一般用于以下两个场景:
(1)页面关联不大,但是需要传递信息的地方。让一个页面作为发送者,另一个页面作为监听者
(2)需要向多个地方发送消息。一个页面作为发送者,多个页面作为监听者。
在实际的开发中,单例,代理,通知中心是用的非常的多,要掌握好
如何创建一个通知中心:
NSNotificationCenter * nc = [NSNotificationCenter defaultCenter];
通知中心要使用到的方法:发送通知、接受通知
通知的原理:
信息的发送者要吧信息发送给监听者,监听者收到信息后就做出相应的回应。
如何使用通知:
首先我们要创建一个通知对象,然后使用通知类NSNotification的 postNotificationName: object: userInfo:方法去发送一个通知。然后 用 addObserver: selector: name: object:方法去接受消息。
如何发送消息:
[通知中心对象 postNotificationName:@"BJBroadcoast" object:self userInfo:dict];{参数讲解:第一个参数:广播的频段 第二个参数:广播的对象 第三个参数:广播的内容(需要定义一个字典)}
如何接收消息:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(recvBcast:) name:@"BJBroadcoast" object:nil];
//这里 name 的属性值要与前面的 通知中心的第三个参数通知内容(字典中的数据一致)
-(void)recvBcast:(NSNotification *)notify{/接收消息的方法实现,这里要注意接受数据的时候是 NSNotification类对象来接受的,不是NSNotificationCenter 来接收的
//notify 就是具体的广播消息
NSLog(@"notify is %@",notify.name);
}
对应的例子代码:
#import <Foundation/Foundation.h>
#import "Listener.h"
#import "BJBroadcast.h" int main(int argc, const char * argv[]) {
//BJBrocast 北京广播电台
//Listener 听众
@autoreleasepool {
//观众先去监听,才能够接受到广播。如果观众后接听,那就让广播不停的去发送信息
Listener * listen = [[Listener alloc]init];
[listen wantToListern]; BJBroadcast * bj = [[BJBroadcast alloc]init];
[bj broadcast];
//不停的发送广播
[bj broadcastLooper]; Listener * li = [[Listener alloc]init];
[li wantToListern];
//防止计数器退出
[[NSRunLoop currentRunLoop] run];
}
return ;
}
main文件
#import <Foundation/Foundation.h> @interface BJBroadcast : NSObject -(void)broadcastLooper;
-(void)broadcast; @end ----------------------------------------------------------------------------------------------------------------(BJBroadcast.m文件)
#import "BJBroadcast.h" @implementation BJBroadcast -(void)broadcastLooper{
//启动一个定时器定时的发送广播
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(broadcast) userInfo:nil repeats:YES];
}
-(void)broadcast{
//1. 取得通知中心
// NSNotificationCenter 在UI里有个致命的缺陷,就是子线程和重线程之间的冲突
NSNotificationCenter * nc = [NSNotificationCenter defaultCenter];
static int i ;
NSString * count = [NSString stringWithFormat:@"bcast %d",i++];
//消息内容
NSDictionary * dict = [NSDictionary dictionaryWithObjectsAndKeys:@"BJbrocast",@"name" ,count,@"Value",nil];
//2. 发送广播
//第一个参数:广播的频段 第二个参数:广播的对象 第三个参数:广播的内容
[nc postNotificationName:@"BJBroadcoast" object:self userInfo:dict]; }
@end
BJBroadcast文件
————————————————————————————————————————————————————————(.h文件) #import <Foundation/Foundation.h> @interface Listener : NSObject //想听广播
-(void)wantToListern;
@end ————————————————————————————————————————————————————————(.m文件) #import "Listener.h" @implementation Listener
//想听广播
-(void)wantToListern{
//1.要注册
//param1 ,param2 这两个参数是只要有BJBroadcoast 广播就调用 [self recvBcast:]方法。
//这里 name 的属性值要与前面的 通知中心的第三个参数通知内容(字典中的数据一致)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(recvBcast:) name:@"BJBroadcoast" object:nil];
//2.要真正的接受广播数据
} -(void)recvBcast:(NSNotification *)notify{
//notify 就是具体的广播消息
NSLog(@"notify is %@",notify.name);
}
@end
Listener文件
通知在UI中对于子线程和重线程的解决方案:
当用NSNotification,在回调函数里面对tableview进行reloadData时,并不能更新UI,而且还会导致以后都更新不了。后来查了一些资料才发现,postNotification之后调用回调函数,相当于开了一个子线程,而子线程中是不能更新UI的。所以要想在notification的回调里面更新UI,必须用
dispatch_async(dispath_get_main_queue(),^{
[tableview reloadData];
}];
(总结)代码中的全局变量的使用, 定时器循环调用一个方法,通知中心的单例对象的创建
NSNotification 里面有三个参数,点开查看:
@interface NSNotification : NSObject <NSCopying, NSCoding>
@property (readonly, copy) NSString *name;
@property (readonly, retain) id object;
@property (readonly, copy) NSDictionary *userInfo;
上面的三个参数于我们 消息中心 NSNotificationCenter 的消息发送对象里面的三个参数对应,这就是为啥监听者类在接受消息的时候,要进行注册的缘故。
UI:文件操作、通知中心的更多相关文章
- [Xcode 实际操作]七、文件与数据-(6 )通过通知中心,实现监听和处理程序退出事件的功能
目录:[Swift]Xcode实际操作 本文将演示通过通知中心,实现监听和处理程序退出事件的功能. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import U ...
- qt ui程序使用Linux的文件操作open、close (转)
原文地址:qt ui程序使用Linux的文件操作open.close 作者:kjpioo 提出这个问题是因为在qt的QWidget类型的对象中,close()函数会和QWidget::close()冲 ...
- IOS开发-UI学习-沙盒机制&文件操作
苹果为软件的运行提供了一个沙盒机制 每个沙盒含有3个文件夹:Documents, Library 和 tmp.因为应用的沙盒机制,应用只能在几个目录下读写文件 Documents:苹果建议将程序中 ...
- 使用 Swift 制作一个新闻通知中心插件(1)
input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...
- iOS 通知中心扩展制作初步-b
涉及的 Session 有 Creating Extensions for iOS and OS X, Part 1 Creating Extensions for iOS and OS X, Par ...
- Swift 制作一个新闻通知中心插件1
使用 Swift 制作一个新闻通知中心插件(1) 随着 iOS 8 的发布,苹果为开发者们开放了很多新的 API,而在这些开放的接口中 通知中心插件 无疑是最显眼的一个.通知中心就不用过多介绍了,相信 ...
- 使用 Swift 制作一个新闻通知中心插件(2)
我们在第一部分的文章中详细讲解了创建一个通知中心插件的整体过程.我们成功的在通知中心里面显示了新闻列表.但是截止到目前,我们还不能从通知中心的列表中查看新闻的详细内容.在这次的教程中,我们就以上次的教 ...
- iOS之NSNotificationCenter通知中心使用事项
其实这里的通知和之前说到的KVO功能很想,也是用于监听操作的,但是和KVO不同的是,KVO只用来监听属性值的变化,这个发送监听的操作是系统控制的,我们控制不了,我们只能控制监听操作,类似于Androi ...
- iOS开发之通知中心(NSNotificationCenter)
前言 面向对象的设计思想是把行为方法封装到每一个对象中,以用来增加代码的复用性.正是这种分散封装,增加了对象之间的相互关联,总是有很多的对象需要彼此了解以及相互操作! 一个简单示例说明这种交互产生的对 ...
随机推荐
- [CodePlus2017]汀博尔
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 158 Solved: 61[Submit][Status][Discuss] Description ...
- hdu3306:Another kind of Fibonacci
A(0)=A(1)=1,A(i)=X*A(i-1)+Y*A(i-2),求S(n)=A(0)^2+A(1)^2+A(2)^2+A(3)^2+……+A(n)^2. 这个矩阵有点毒.. #include&l ...
- apache + DSO -动态共享对象(DSO)
http://www.jinbuguo.com/apache/menu22/dso.html
- HDU 5883 欧拉路径异或值最大 水题
The Best Path Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- Edit Distance(动态规划,难)
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2 ...
- 2017年icpc西安网络赛 Maximum Flow (找规律+数位dp)
题目 https://nanti.jisuanke.com/t/17118 题意 有n个点0,1,2...n-1,对于一个点对(i,j)满足i<j,那么连一条边,边权为i xor j,求0到n- ...
- 表皮囊肿?wtf
https://baike.baidu.com/item/%E8%A1%A8%E7%9A%AE%E5%9B%8A%E8%82%BF/7852024?fr=aladdin
- [Node.js] Write or Append to a File in Node.js with fs.writeFile and fs.writeFileSync
In node.js, you can require fs, and then call fs.writeFile with the filename, and data to write to t ...
- 在DIV中自己主动换行
word-break:break-all和word-wrap:break-word都是能使其容器如DIV的内容自己主动换行. 它们的差别就在于: 1,word-break:break-all 比如di ...
- 异或巧用:Single Number
异或巧用:Single Number 今天刷leetcode,碰到了到题Single Number.认为解答非常巧妙,故记之... 题目: Given an array of integers, ev ...