本文中将简单介绍几个笔者认为在开发中很有用的iOS开源类库及其简单使用方法
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"]);
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) { //处理网络错误 } }
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
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