本周着重掌握以下知识点:
- AppDelegate相关函数
- ARC下数据的关键词的修饰问题
- KVO 键值观察者
- NotificationCenter 通知中心实现消息的传递
- Block的使用
- FMDB
我的简书链接
AppDelegate相关函数
1、- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
当程序启动时,会调用该函数,其中NSDictionary参数存储应用程序启动的原因,包括:
- 由用户直接启动,
launchOptions
内无数据 - 由
openURL
打开,则UIApplicationLaunchOptionsURLKey
对应的对象为启动URL(NSURL)
,UIApplicationLaunchOptionsSourceApplicationKey
对应启动的源应用程序的bundle ID (NSString)
- 在iOS中如果点击一个弹出通知(或者锁屏界面滑动查看通知),默认会自动打开当前应用。由于通知由系统调度那么此时进入应用有两种情况:如果应用程序已经完全退出那么此时会调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
如果此时应用程序还在运行(无论是在前台还是在后台)则会调用
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
接收消息参数。当然如果是后者自然不必多说,因为参数中已经可以拿到notification对象,只要读取userInfo属性即可。如果是前者的话则可以访问launchOptions
中键为UIApplicationLaunchOptionsLocalNotificationKey
的对象,这个对象就是发送的通知,由此对象再去访问userInfo。
2、- (void)applicationWillResignActive:(UIApplication *)application
当程序进入非活动状态是执行,运行时程序不支持消息和事件。
- 比如来电话时会执行
3、- (void)applicationDidEnterBackground:(UIApplication *)application
当应用程序进入后台程序时调用,要设置程序后台运行时序设置此函数
4、- (void)applicationDidBecomeActive:(UIApplication *)application
当程序从进入活动状态时调用,该函数与函数<2>正好相反
5、- (void)applicationWillTerminate:(UIApplication *)application
当程序将要退出时调用,用来保存数据和做清理工作
6、- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
当程序占用太多内存是会调用该函数,在其中执行一些清理内存的工作
2.ARC下数据的关键词的修饰问题
- assign : 基本数据类型/枚举/结构体
- copy : NSString/NSMutableString/block
- weak : UI控件/代理
- strong : 其他OC对象,是ARC下的默认属性类型(相当于在非ARC下retain)
使用_weak来修饰变量:
目前我认为主要使用在Delegate和Block中,比如将tableView添加到一个VIewController中,那么VIewController对于tableView来说就是就是强引用,如果tableView的代理也是ViewController就会造成循环引用,Block的用法与此类似。
KVO 键值观察者
即是Key-Value-Observe ,键-值观察者,对一个变量的属性进行监听,当它的值发生变化时,就会触发相应的方法。
//注册监听器
[child addObserver:self
forKeyPath:@"happyValue"
option:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld
context:nil];
/*
参数说明
child:要监控的对象
self:实现监听触发事件的代理
happyValue:监听对象的属性
NSKeyValueObservingOptionNew:变化后的值
NSKeyValueObservingOptionOld:变化前的值
content:要传递的信息
*/
//监听触发事件
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
/*
参数说明
keyPath:监听对象的属性
object:监听的对象
change:参数字典
{
new:变化后的值
old:变化前的值
}
content:要传递的信息
*/
//监听触发事件
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
/*
参数说明
keyPath:监听对象的属性
object:监听的对象
change:参数字典
{
new:变化后的值
old:变化前的值
}
content:要传递的信息
*/
//移除观察者
[child removerObserver:self forKeyPath:@"happyValue" ];
/*
参数说明
child:要监控的对象
self:实现监听触发事件的代理
happyValue:监听对象的属性
*/
NotificationCenter 通知中心实现消息的传递
通知中心的原理是一种广播的机制,通知的发送者并不需要知道其观察者都是谁。
通知发布者
NSNotificationCenter
是一个单例对象,当通知被发布时,会被发送到通知中心,通知中心相当于一个交流的场所。
每个通知需要含有以下字段:
- 通知的名称
- 发布通知的对象
- 一个 用于表示其他补充信息的字典,被称为userInfo字典,会被接受当成参数接收。
//发送一个通知
[center PostNotificationName:@"国王万岁" object:某人];
通知接收者
消息接受者通过以下方法得到通知并进行处理:
//注册通知中心并获取通知
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(weakNotification:)
name:KNotificationName
object:nil];
/*
参数说明
[NSNotificationCenter defaultCenter]:注册通知中心单例
self:实现监听触发事件的代理
@selector(weakNotification:):实现监听动作
KNotificationName:监听的 通知名称
NSKeyValueObservingOptionOld:变化前的值
*/
//移除监视者
[center removeObserver:self name:@"国王万岁" object:某人];
Block的使用
Block的使用场景:
当做本地变量:
returnType (^BlockName)(parameterTypes) = ^returnType(Parameters)
{
... ...
}
宏定义一个Block,使用起来更为方便
typedef returnType(^BlockName)(ParameterA ValueA,ParameterB ValueB);
设置完宏定义后可将其设置为属性作为回传函数,实现信息的调用
@property (nonatomic, copy)returnType (^BlockName)(ParameterA ValueA,ParameterB ValueB)
- Block的属性为copy
在消息发送方使用方法为:
- (void)postMassage:(NSDictionary *)info responseBlock:(BlockName *) block
{
//DoSth.
if (responseBlock)
{
responseBlock(ValueA, ValueB);
}
}
在消息接受函数中可以如下使用
[receiveObject postMassage:info responseBlock ^returnType(ParameterA ValueA,ParameterB ValueB)
{
//Respond
}];
FMDB(本周未能实现)
FMDB是iOS平台的SQLite数据库框架
FMDB主要有三个类
- FMDatabase
一个FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句 - FMResultSet
使用FMDatabase执行查询后的结果集 - FMDatabaseQueue
用于在多线程中执行多个查询或更新,它是线程安全的(没用到)
使用方法:
创建数据库:
FMDatabase *dataBase = [FMDatabase databaseWithPath:@"tem.db"];
文件目录通常有以下几种:
- 具体文件路径
- 空字符串@"",会在临时目录创建一个空的数据库,当FMDatabase连接关闭时,数据库文件也被删除
- 创建在沙盒中
打开数据库
[dataBase open]
更新方法
- (BOOL)executeUpdate:(NSString*)sql, ...
- (BOOL)executeUpdateWithFormat:(NSString*)format, ...
- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments
查询方法
- (FMResultSet *)executeQuery:(NSString*)sql, ...
- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...
- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
Example
// 查询数据
FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];
// 遍历结果集
while ([rs next])
{
NSString *name = [rs stringForColumn:@"name"];
int age = [rs intForColumn:@"age"];
double score = [rs doubleForColumn:@"score"];
}
FMDatabaseQueue(正在学习掌握)
FMDatabase这个类是线程不安全的,如果在多个线程同时使用一个FMDatabase实例,会造成数据混乱问题
为了保证线程安全,FMDB提供方便快捷的FMDatabaseQueue类
FMDatabaseQueue的创建
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
//简单使用
[queue inDatabase:^(FMDatabase *db)
{
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Rose"];
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jim"];
FMResultSet *rs = [db executeQuery:@"select * from t_student"];
while ([rs next])
{
// DoSth.
}
}];
补习常用SQL语句
@“CREATE TABLE IF NOT EXISTS weibodb
(
uid integer PRIMARY KEY AUTOINCREMENT,
name text NOT NULL,
time text NOT NULL,weibo text NOT NULL,
userIcon text NOT NULL,
repostsCount integer,
commentsCount integer,
likesCount integer
);"
@"INSERT INTO weibodb (uid,name,time) VALUES (?,?,?)
@"UPDATE weibodb SET name=? WHERE uid=?"
@"DELETE FROM weibodb WHERE name=?"
@"SELECT * FROM weibodb ORDER BY id DESC"
网友评论