一些关于网络方面的内容:


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: