本文中将简单介绍几个笔者认为在开发中很有用的iOS开源类库及其简单使用方法
1: SBJson
SBJson, 又名Json Framework, 是一个非常流行的,开源的JSON解析类库。SBJSon的使用非常简单,为在网络中传输与解析格式化的数据提供了极大的便利。
SBJson的使用也很简单,在项目中将类库文件添加到项目中,然后加入几个依赖的FrameWork,目前比价稳定的有ARC3.1版本的和非ARC版本的3.0,大家可以根据自身需要进行下载。
下面就SBJson的使用进行简单介绍:
#import "SBJSon.h"
//写json
SBJsonWriter* jsonWriter = [[[SBJsonWriter alloc] init] autorelease];
NSMutableArray* tempArray = [NSMutableArray array];
NSDictionary* tempDicA = [NSMutableDictionary dictionary];
[tempDicA addObject @"valueA" forKey @"keyA"];
[tempArray addObject: tempDicA];
NSDictionary* tempDicB = [NSMutableDictionary dictionary];
[tempDicB addObject @"valueB" forKey @"keyB"];
[tempArray addObject: tempDicB];
NSMutableDictionary* jsonDic = [NSMutableDictionary dictionary];
[jsonDic setObject: tempArray forKey: @"array"];
NSString* jsonString = [jsonWriter stringWithObject: jsonDic];
//解析json
NSDictionary* resultDic = [jsonString JSONValue];
NSArray* resultArray = [resultDic objectForKey @"array"];
NSDictionary* dicA = [resultArray objectAtIndex: 0];
NSDictionary* dicB = [resultArray objectAtIndex: 1];
NSLog(@"%@, %@" [dicA objectForKey @"keyA", [dicB objectForKey: @"keyB"]);
2: ASIHTTPRequest
ASIHTTPRequest是一个非常流行的iOS平台网络通信类库,使用ASIHTTPRequest之后,大大简化了iOS平台的网络编程。其以方便的接口对同步、异步的网络传输进行了传输,将ASIHTTPRequest添加到自己的项目也非常方便,将类库中所有文件拷贝到一个文件夹中,然后将此文件夹添加到项目中,同时要添加如下图CFNetWork之下所示的类库,就可以使用ASIHTTPRequest了:
使用ASIHTTPRequest步骤非常简答,在一般应用开发中,网络连接基本上使用的都是异步方式,下面简单演示一下最简单的异步通讯方法
#import "ASIHTTPRequest.h"
- (void) requestDataFromServer
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSURL* url = [NSURL URLWithString: @"www.fakeurl.com"];
ASIHTTPRequest* request = [ASIHTTPRequest requestWithURL: url];
[request setTag: 1024];
[request setTimeOutSeconds: 3];
[request setAllowCompressedResponse:YES];
[request setDelegate:self];
[request startAsynchronous];
[pool drain];
}
- (void)requestFinished:(ASIHTTPRequest *)request
{
NSString* rawString = [request responseString];
if (request.tag == 1024) {
//处理网络返回结果
}
}
- (void)requestFailed:(ASIHTTPRequest *)request
{
if (request.tag == 1024) {
//处理网络错误
}
}
2: ASIHTTPRequest
ASIHTTPRequest是一个非常流行的iOS平台网络通信类库,使用ASIHTTPRequest之后,大大简化了iOS平台的网络编程。其以方便的接口对同步、异步的网络传输进行了传输,将ASIHTTPRequest添加到自己的项目也非常方便,将类库中所有文件拷贝到一个文件夹中,然后将此文件夹添加到项目中,同时要添加如下图CFNetWork之下所示的类库,就可以使用ASIHTTPRequest了:
使用ASIHTTPRequest步骤非常简答,在一般应用开发中,网络连接基本上使用的都是异步方式,下面简单演示一下最简单的异步通讯方法
#import "ASIHTTPRequest.h"
- (void) requestDataFromServer
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSURL* url = [NSURL URLWithString: @"www.fakeurl.com"];
ASIHTTPRequest* request = [ASIHTTPRequest requestWithURL: url];
[request setTag: 1024];
[request setTimeOutSeconds: 3];
[request setAllowCompressedResponse:YES];
[request setDelegate:self];
[request startAsynchronous];
[pool drain];
}
- (void)requestFinished:(ASIHTTPRequest *)request
{
NSString* rawString = [request responseString];
if (request.tag == 1024) {
//处理网络返回结果
}
}
- (void)requestFailed:(ASIHTTPRequest *)request
{
if (request.tag == 1024) {
//处理网络错误
}
}
2: ASIHTTPRequest
ASIHTTPRequest是一个非常流行的iOS平台网络通信类库,使用ASIHTTPRequest之后,大大简化了iOS平台的网络编程。其以方便的接口对同步、异步的网络传输进行了传输,将ASIHTTPRequest添加到自己的项目也非常方便,将类库中所有文件拷贝到一个文件夹中,然后将此文件夹添加到项目中,同时要添加如下图CFNetWork之下所示的类库,就可以使用ASIHTTPRequest了:
使用ASIHTTPRequest步骤非常简答,在一般应用开发中,网络连接基本上使用的都是异步方式,下面简单演示一下最简单的异步通讯方法
注意上面的两个函数中,后面连个为ASIHTTPRequest的delegate函数,其声明类型不能改变,只要在生成ASIHTTPRequest时的deleage设成了self,那么最后返回结果,不管是成功调用还是网络失败,都会调用这两个函数中的对应的一个。
3: FMDataBase
FMDataBase是iOS平台中一个非常强大的数据库类库,其将sqlite面向过程的接口以面向对象的方法展现出来,提供了极高的可用性。
其使用很简单,将sqlite 库添加到项目中,然后将FMDataBase类库文件添加到项目中,下面是对笔者对FMDataBase进行的一个二次封装,处理的数据库很简单,只有一张表,两个列,存储的都是一些key-value对,读者可以根据自身需要对此类进行修改。
#import <Foundation/Foundation.h>
#import "FMDatabase.h"
@interface DBController : NSObject {
}
@property (nonatomic, assign) FMDatabase *dataBase;
+(BOOL)databaseExit;
-(BOOL)initDatabase;
-(void)closeDatabase;
-(BOOL)deleteTable;
-(BOOL)InsertTable:(NSString *)key_type value:(NSString *)key_value;
-(BOOL)UpdataTable:(NSString *) valueStr key:(NSString *)keyStr;
-(NSMutableDictionary *)querryTable;
+(BOOL) deleteDataBase;
@end
@synthesize dataBase = _dataBase;
- (id)init{
if(self = [super init]){
_dataBase = [FMDatabase databaseWithPath: [DBController getPath]];
if (![_dataBase open]) {
NSLog(@"Create/Open dataBase %@ Failed!", [DBController getPath]);
}
}
return self;
}
//数据库是否存在
+(BOOL)databaseExit
{
return [[NSFileManager defaultManager] fileExistsAtPath: [self getPath]];
}
//初始化数据库
-(BOOL)initDatabase{
if ([DBController databaseExit]) {
return [self createTable];
}
return NO;
}
//创建数据库
-(BOOL)createTable
{
return [self.dataBase executeUpdate: @"create table if not exists personTable(id integer primary key autoincrement, key text,value text);"];
}
//删除数据表
-(BOOL)deleteTable{
if ([DBController databaseExit]) {
return [self.dataBase executeUpdate: [NSString stringWithFormat:@"drop table %@;",_PERSONINFO]];
}
return NO;
}
//关闭数据库
- (void) closeDatabase
{
[self.dataBase close];
}
//插入数据
-(BOOL)InsertTable:(NSString *)key value:(NSString *)value
{
if ([DBController databaseExit]) {
BOOL result = NO;
[self.dataBase beginTransaction];
result = [self.dataBase executeUpdate:@"INSERT INTO personTable (key,value) VALUES (?,?)", key, value];
[self.dataBase commit];
return result;
}
return NO;
}
//更新数据
-(BOOL)UpdataTable:(NSString *) valueStr key:(NSString *)keyStr
{
if ([DBController databaseExit]) {
BOOL result = NO;
[self.dataBase beginTransaction];
result = [self.dataBase executeUpdate:@"UPDATE personTable SET value=? WHERE key=?", valueStr, keyStr];
[self.dataBase commit];
return result;
}
return NO;
}
//查询整个表
-(NSMutableDictionary *)querryTable
{
NSMutableDictionary* resultDic = [[NSMutableDictionary alloc] init];
FMResultSet *rs = [self.dataBase executeQuery:@"select * from personTable"];
while ([rs next]) {
[resultDic setObject: [rs stringForColumn: @"value"] forKey: [rs stringForColumn: @"key"]];
}
return [resultDic autorelease];
}
+(BOOL) deleteDataBase
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:_DBNAME];//设置数据库得路径
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL find = [fileManager fileExistsAtPath:path];
if (find) {
[fileManager removeItemAtPath: path error: nil];
}
return find;
}
- (void)dealloc {
[_dataBase close];
_dataBase = nil;
[super dealloc];
}
+ (NSString*) getPath {
// 打开的数据库
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:_DBNAME];//设置数据库得路径
}
@end
4: MPProgressHUD
MPProgressHUD是一个非常好用的进度指示器类库,其提供了苹果官方sdk没有提供的progress indicator接口,且提供多种样式,使用方法简便。
首先将类库文件添加到项目中。
使用实例代码如下:
#import <UIKit/UIKit.h>
#import "MBProgressHUD.h"
#import <libkern/OSAtomic.h>
@interface SampleViewController : UITableViewController <MBProgressHUDDelegate>
@property (nonatomic, retain) NSCondition* condition;
@property (nonatomic, retain) MBProgressHUD* hud;
@end
static volatile NSInteger WAITING_RESPONSE_FOR_SERVERRESPONSE = 0;
- (void) popOutMBProgressHUD;
- (void) selectorForMPProgressHUD;
- (void) notifyMPProgressHUDToDisappear;
@implementation SampleViewController
@synthesize hud = _hud;
@synthesize condition = _condition;
- (id) initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder: aDecoder];
if (self != nil) {
_hud = nil;
_condition = [[NSCondition alloc] init];
}
return self;
}
- (void) dealloc
{
[_hud release];
[_condition release];
}
- (void) popOutMBProgressHUD
{
MBProgressHUD* tempHud = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
self.hud = tempHud;
[self.navigationController.view addSubview: tempHud];
self.hud.dimBackground = YES;
self.hud.delegate = self;
self.hud.labelText = @"正在处理";
[self.hud showWhileExecuting:@selector(selectorForMPProgressHUD) onTarget:self withObject: nil animated:YES];
[tempHud release];
}
- (void) selectorForMPProgressHUD
{
OSAtomicCompareAndSwapInt(0,
1,
&WAITING_RESPONSE_FOR_SERVERRESPONSE);
[self performSelectorInBackground: @selector(tempSelector) withObject: nil];
[self.condition lock];
while (OSAtomicCompareAndSwapInt(1,
1,
&WAITING_RESPONSE_FOR_SERVERRESPONSE)) {
NSDate* timeOutDate = [NSDate dateWithTimeIntervalSinceNow: 5.0f];
[self.condition waitUntilDate: timeOutDate];
}
[self.condition unlock];
}
- (void) notifyMPProgressHUDToDisappear
{
//通知进度显示hud消失
[self.condition lock];
OSAtomicCompareAndSwapInt(1,
0,
&WAITING_RESPONSE_FOR_SERVERRESPONSE);
[self.condition signal];
[self.condition unlock];
}
- (void)hudWasHidden:(MBProgressHUD *)hud
{
// Remove HUD from screen when the HUD was hidded
[self.hud removeFromSuperview];
self.hud = nil;
}
- (void) tempSelector
{
sleep(3.0f);//模拟真实的耗时操作
[self notifyMPProgressHUDToDisappear];
}
@end
2: ASIHTTPRequest
ASIHTTPRequest是一个非常流行的iOS平台网络通信类库,使用ASIHTTPRequest之后,大大简化了iOS平台的网络编程。其以方便的接口对同步、异步的网络传输进行了传输,将ASIHTTPRequest添加到自己的项目也非常方便,将类库中所有文件拷贝到一个文件夹中,然后将此文件夹添加到项目中,同时要添加如下图CFNetWork之下所示的类库,就可以使用ASIHTTPRequest了:
使用ASIHTTPRequest步骤非常简答,在一般应用开发中,网络连接基本上使用的都是异步方式,下面简单演示一下最简单的异步通讯方法