一些关于网络方面的内容:
1.下载
下载一般写成一个单例类(NetAccess), 主进程调用下载实例中的下载函数, 下载完成后, 通过代理, 将下载的数据传给主进程
1)使用系统自带的方法下载
a.把一个地址转换为URL [NSURL URLWithString: ]
b.写出一个请求 [NSURLRequest requestWithURL: ]
c.建立连接 [[NSURLConnection alloc] initWithRequest: delegate:self]
遵守<NSURLConnectionDataDelegate>:
- (void)connection: didReceiveResponse: // 受到响应时, 通常在会在这里将数据源清空([_data setLength:0]), 响应的状态码:[response statusCode]
- (void)connection: didReceiveData:(NSData *)data // 下载中, 会不断的调用这个方法, [_data appendData:data]
- (void)connectionDidFinishLoading: // 下载完成
// 对象delegate是否实现了方法method
if ([self.delegate respondsToSelector:self.method]) {
// 调用对象delegate的方法method, 参数是self自身
[self.delegate performSelector:self.method withObject:self];
}
- (void)connection: didFailWithError: // 下载失败, 将数据源清空, 并且回调上面的方法, 通知用户
2)使用第三方库ASIHttpRequest
需要增加4个库文件: SystemConfiguration.framework, MobileCoreServices.framework, CFNetwork.framework, libz
ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL: ] // 通过一个URL建立一个请求(接口参数可以写在URL中, http://192.168.88.8/sns?username=%@&password=%@, stringByAddingPercentEscapesUsingEncoding:对字符串使用防止中文乱码)
[request startSynchronous] // 开始同步下载
[request startAsynchronous] // 开始异步下载
遵守<ASIHTTPRequestDelegate>: // request.delegate = self;
- (void)requestFinished:(ASIHTTPRequest *)request // 下载成功
- (void)requestFailed:(ASIHTTPRequest *)request // 下载失败
3)Post下载, 使用第三方库ASIFormDataRequest
使用方法和ASIHttpRequest基本一样, 只是在上传数据时不同, [request setPostValue: forKey:]
4)SDWebImage, 图片下载的第三方类
[p_w_picpathView setImageWithURL: ]
2.JSON解析
1)使用系统自带的解析方法
[NSJSONSerialization JSONObjectWithData:aData options:NSJSONReadingMutableContainers error:nil] // 将得到的数据源解析为字典
2)使用第三方库SBJson
[request.responseData JSONValue] // 解析JSON并存储在字典中
3.XML解析
使用第三方库GDataXMLNode, 需增加一个库文件libxml2.dylib, 并修改Header Search Paths的XMLDemo地址为/usr/include/libxml2
GDataXMLDocument *root = [[GDataXMLDocument alloc] initWithData:aData options:0 error:nil]; // 从下载得到的数据得到整个XML文件
第三方库使用XPath方法查找(根据节点的名字, 自动找到对应节点, 返回一个数组, 元素都是GDataXMLElement类型):
1)模糊查找(找到所有和要查找的相同名字的节点, 返回一个数组)
NSArray *array = [root nodesForXPath:@"//user" error:nil];
for (GDataXMLElement *user in array) // 遍历array数组中的每一个user节点
NSArray *subArray = [user elementsForName:@"uid"]; // 从user节点中得到名字为uid的子节点, 返回值依旧是数组
[[subArray lastObject] stringValue] // 得到查找元素的值
2)精确查找(只要找到一个, 就返回一个数组, 不再继续查找)
NSArray *array = [root nodesForXPath:@"/user_list/user" error:nil];
4.数据库
1)添加(关键字不区分大小写, 但是数据库名和字段区分大小写)
insert into user values() // 添加全部字段
insert into user(UserName, UserSex, UserAge) values('赵钱', 2, 16); // 添加使用指定字段
2)修改
UPDATE user SET UserAge = 30 WHERE UserID = 4;
update user set UserScore = 93, UserAge = 50 where UserID = 3;
3)删除
DELETE * FROM user; // 删除user中的全部内容
DELETE FROM user WHERE UserId = 4; // 删除指定内容
DROP TABLE user; // 删除整张表
DROP DATABASE SQLiteDemo; // 删除数据库
4)查询
SELECT * FROM user; // 查询整张表中的所有内容
SELECT * FROM user WHERE UserSex = 1;
SELECT UserName FROM user WHERE UserSex = 1;
SELECT UserName, UserID FROM user WHERE UserSex = 1; // 得到的结果根据查询顺序来显示
SELECT UserName, UserID FROM user WHERE UserSex = 1 AND UserName = '小明';
SELECT count(*) FROM user; // 查找表中有多少条数据
SELECT * FROM user LIMIT 3; // 查出前3条数据
SELECT * FROM user ORDER BY UserID DESC; // 通过UserID降序排列 (ASC升序)
5)创建表
create table user(UserID integer primary key autoincrement, UserName text(1024) default NULL, UserAge integer, UserSex integer // 创建一个表, 表名user, 拥有字段UserID(NSNumber型, 主键, 从1开始自增长), UserName(NSString型, 最大长度1024, 默认为空), UserAge(NSNumber型), UserSex(NSNumber型)
终端下操作
sqlite3 DataBase.db // 打开数据库
.ta // 查看该数据库下的所有表
.qu // 退出
使用数据库的增删改查命令时要在语句后面加分号
使用第三方库对数据库进行操作, FMDataBase, 需要引入一个库文件libsqlite, 数据库要创建成单例类
[[FMDatabase alloc] initWithPath:[NSString stringWithFormat:@"%@/Documents/DataBase.db", NSHomeDirectory()]];
[dataBase open] // 使用数据库之前要先开启
[dataBase executeUpdate: ] // 执行一条除查询外的数据库操作语句
[dataBase executeQuery: ] // 查询的结果要放在一个FMResultSet中
while ([resultSet next]) { // 遍历的方法
int userID = [resultSet intForColumn:@"UserID"]; // 得到对应键的值
NSString *userName = [resultSet stringForColumn:@"UserName"];
}
5.NSThread
[self performSelectorInBackground:@selector() withObject: ] // 开启异步线程执行selector中的方法
[self performSelectorOnMainThread:@selector() withObject: waitUntilDone:NO] // 回调主线程
[NSThread detachNewThreadSelector:@selector() toTarget:self withObject:nil] // 创建后立即调用, 在后台
[[NSThread alloc] initWithTarget: selector:@selector() object:nil] // 创建之后需手动调用[thread start], 另可设置线程优先级
[thread setThreadPriority: ] // 设置优先级
[thread setName: ] // 设置线程名
[[NSThread currentThread] name] // 当前线程名
[NSThread sleepForTimeInterval:5] // 线程睡眠5秒
[NSThread sleepUntilDate: ]
[NSThread exit] // 结束当前线程
NSCondition线程锁
[[NSCondition alloc] init]
[condition broadcast] // 唤醒所有线程
[condition signal] // 唤醒在锁上等待的一个线程
[condition lock] // 上锁
[condition unlock] // 解锁
condition.name // 设置名字
6.NSInvocationOperation(多线程)
[[NSInvocationOperation alloc] initWithTarget:self selector:@selector() object:nil] // object的值是要传递给前面方法的值
NSOperationQueue相当于一个线程管理器, 可以设置线程运行的数量([operationQueue setMaxConcurrentOperationCount: ]), 设置为单例类
将线程加入队列中就会运行, [operationQueue addOperation: invocationOperation]
7.MKMapView (MK: MapKit, MapKit.framework) <MKMapViewDelegate>
CoreLocation是位置服务, 用于获取地理位置, 库文件CoreLocation.framework
mapView.mapType = MKMapTypeSatellite; // 卫星模式, MKMapTypeStandard; MKMapTypeHybrid
[mapView convertPoint:point toCoordinateFromView:mapView]; // 将屏幕坐标点转换成地图经纬度
mapView.showsUserLocation = YES; // 显示用户位置
mapView.userLocationVisible = YES; // 用户当前位置是否可见
mapView.userLocation.location.coordinate // 用户位置坐标
mapView.annotations // mapView中的所有annotation
<MKMapViewDelegate>协议中的方法:
- (MKAnnotationView *)mapView: viewForAnnotation: // 用法类似于cell的复用
[annotation isKindOfClass:[MKUserLocation class]] // 用之前, 先判断一下, 是否是用户当前位置
annotationView.leftCalloutAccessoryView annotation.rightCalloutAccessoryView // 左右侧能添加的视图
annotationView.canShowCallout = YES; // 可以显示添加的视图
在MKMapView中显示某个位置
1)CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(39.966341, 116.323269); //先找到要显示地点的经纬度
2)MKCoordinateSpan span = MKCoordinateSpanMake(0.003, 0.003); // 设置一个地图精度, 决定显示范围
3)MKCoordinateRegion region = MKCoordinateRegionMake(coordinate, span); // 将经纬度和精度合成一个地图区域
4)[mapView setRegion:region]; // 设置到地图控件中
在MKMapView中显示大头针 (自己写一个大头针信息类, 遵从MKAnnotation协议)
MapAnnotation *annotation = [[MapAnnotation alloc] init];
annotation.annotationTitle
annotation.annotationSubTitle
annotation.annotationCoordinate = CLLocationCoordinate2DMake(39.966503,116.32321);
[mapView addAnnotation: annotation];
协议中的方法:
- (NSString *)title;
- (NSString *)subtitle;
- (CLLocationCoordinate2D)coordinate;
使用CLLocationManager获取当前位置, <CLLocationManagerDelegate>
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest; // 设置定位的精度
locationManager.distanceFilter = 500; // 距离过滤器, 每次位置更新回调触发所需的距离变化
[locationManager startUpdatingLocation];
-(void)locationManager: didUpdateToLocation: fromLocation: