SDK For Android, iOS
Augmented Reality SDK
2012年1月18日 星期三
2012年1月11日 星期三
iOS - Thread - NSOperation
目的
- 使用NSOperationQueue達成執行緒實作
工具
- NSOperation
- 執行緒
- NSOperationQueue
- 執行緒池,將NSOperation放入交由系統執行
- NSCondition
- 類似JAVA中的synchronized機制,使用"lock" & "unlock"防止多執行緒同時存取相同的變數
﹣實現Producer & Consumer
Store.h
// Store用來管理Producer及Consumer一同存取的容器
// 故需要考慮到同步的問題,不可發生同時存取相同容器的問題
@interface Store : NSObject
{
NSMutableArray* mProducts; NSCondition* mLocker;
}
- (id) initStore;
- (void) add:(NSNumber*) product;
- (NSNumber*) get;
@end#import "Store.h"
@implementation Store
- (id) initStore
{
self = [super init];
if (self){
mProducts = [[NSMutableArray alloc] init];
mLocker = [[NSCondition alloc] init];
}
return self;
}
- (void) add:(NSNumber*) product
{
// 同步add product階段
[mLocker lock];
while ([mProducts count] >= 2)
{
[mLocker wait];
}
[mProducts addObject:product];
[mLocker signal];
// wake up one thread
[mLocker unlock];
}
- (NSNumber*) get
{
// 同步get product階段
[mLocker lock];
while ([mProducts count] <= 0)
{
[mLocker wait];
NSNumber* product = [mProducts objectAtIndex:0];
[mProducts removeObjectAtIndex:0];
[mLocker signal];
// wake up one thread
[mLocker unlock]; return product;
}
@end
Producer.h
// 將數字放入容器中 #import "Store.h"
@interface Producer : NSOperation
{
Store* mStore;
}
- (id) initProducer:(Store*) store;
- (void) main;
@endProducer.m #import "Producer.h"
@implementation Producer
- (id) initProducer:(Store*) store
{
self = [super init];
if (self) {
mStore = store;
}
return self;
}
- (void) main
{
for (int iProduct = 1; iProduct <= 10; iProduct++)
{
// 隨機睡眠 0~4秒
[NSThread sleepForTimeInterval:(arc4random() % 5)];
[mStore add:[NSNumber numberWithInt:iProduct]];
NSLog(@"Produce %d", iProduct);
}
}
@endConsumer.h // 將收字從容器中拿出 #import "Store.h"
@interface Consumer : NSOperation
{
Store* mSotre;
}
- (id) initConsumer:(Store*) store;
- (void) main;
@endConsumer.m
#import "Consumer.h"
@implementation Consumer
- (id) initConsumer:(Store*) store
{
self = [super init];
if (self)
{
mSotre = store;
}
return self;
}
- (void) main
{
for (int iLoop = 0; iLoop <= 10; iLoop++)
{
[NSThread sleepForTimeInterval:(arc4random() % 5)];
NSLog(@"Consume %d", [[mSotre get] intValue]);
}
}
@end
ViewController.h
#import "Producer.h"
#import "Consumer.h"
#import "Store.h"
@interface ViewController : UIViewController
{
NSOperationQueue* mQueue;
Producer* mProducer;
Consumer* mConsumer;
Store* mStore;
}
@endViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
mQueue = [[NSOperationQueue alloc] init];
mStore = [[Store alloc] initStore];
// 將Store放入Producer & Consumer裡
mProducer = [[Producer alloc] initProducer:mStore];
mConsumer = [[Consumer alloc] initConsumer:mStore];
// 將Producer & Consumer放入Operation queue中,
// 開始執行Producer & Consumer
[mQueue addOperation:mProducer];
[mQueue addOperation:mConsumer];
}Note
- 其中"[mLocker signal];" 可代換成"[mLocker broadcast];",差別在於前者"signal"喚醒一個等待此thread的thread;而後者喚醒所有在等待此thread的thread
2012年1月10日 星期二
iOS - ASIHTTPRequest
目的
﹣Code
.h
.m
Note
- 用於網路溝通
- 官方網站
- 解壓後放入欲使用的專案中
使用範例
﹣欲下載網路圖片如下
![]() |
| 圖片來源 |
.h
#import <UIKit/UIKit.h> #import "ASIHTTPRequest.h" #import "ASINetworkQueue.h" @interface ViewController : UIViewController <ASIHTTPRequestDelegate> { NSMutableData* mDataBuf; ASINetworkQueue* mQue; NSArray* mUrls } @end |
.m
- (void)viewDidLoad { [super viewDidLoad]; // 下載的緩衝區 mDataBuf = [[NSMutableData alloc] init]; // 執行Request區域,類似NSOperationQueue, // 故在執行Request時是以執行緒方式進行,不影響原執行緒 mQue = [[ASINetworkQueue alloc] init]; [mQue reset]; [mQue setShowAccurateProgress:YES]; [mQue go]; // 設定下載位址 NSURL* url = [NSURL URLWithString:@"http://c.blog.xuite.net/c/b/6/5/20656505/blog_1172634/txt/23851923/10.jpg"]; ASIHTTPRequest* request = [[ASIHTTPRequest alloc] initWithURL:url]; // 設置ASIHTTPRequest delegate,用於回傳訊息並處理 request.delegate = self; // 開始處理Request [que addOperation:request]; } // ASIHTTPRequestDelegate 接收到資料後 - (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data { [mDataBuf appendData:data]; NSLog(@"Recevie %d bytes...", [data length]); } // ASIHTTPRequestDelegate 資料接收完成 - (void)requestFinished:(ASIHTTPRequest *)request { // 取得存放位置 NSArray *pathList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path = [pathList objectAtIndex:0]; // 指定 資料夾 path = [path stringByAppendingPathComponent:[NSString stringWithFormat:@"/tmp/test"]]; // 若指定資料夾不存在則創建 NSFileManager* fileM = [NSFileManager defaultManager]; NSError* error; if(![fileM fileExistsAtPath:path]) [fileM createDirectoryAtPath:path withIntermediateDirectories:true attributes:nil error:&error]; //加上檔名 path = [path stringByAppendingPathComponent: [NSString stringWithFormat: @"/00.jpg"]]; NSLog(@"儲存路徑:%@", path); //寫入檔案 [mDataBuf writeToFile:path atomically:NO]; mDataBuf = [[NSMutableData alloc] init]; NSLog(@"Download success"); } |
Note
- ASIHTTPRequestDelegate還有許多回傳方法,依需要來實作
- 加入專案時可能會發生一堆類似的參考錯誤 "Apple Mach-O Linker (id) Error"
![]() |
| 上述錯誤需加入sqlite3的library |
![]() |
| 進入TARGETS |
2012年1月2日 星期一
iOS - Regular Expression
目的
- 使NSString型態可以使用Regular Expression來表示
工具
範例
NSError* error; // 取得Yahoo的HTML內容 NSString* tmp = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.yahoo.com.tw"] encoding:NSUTF8StringEncoding error:&error]; // 使用regular expression過濾內容 NSString* regEx = @"<title>(.*)</title>"; for(NSString* sub in [tmp componentsMatchedByRegex:regEx]) { NSLog(sub); } |
結果
2012年1月1日 星期日
iOS - 爬 HTML
目標
- 抓取網頁HTML
- 分析HTML
工具
- libxml2: iOS原有的library,parse xml
- Hpple: 開源碼,幫助分析HTML
- Download
- 將資料夾中的TFHpple, TFHppleElement, XPathQuery複製到要開發的資料夾中
- 再加入“-fno-objc-arc”參數關閉ARC功能
![]() |
| 點選紅框標示的地方 |
![]() | ||
點選紅框標示的地方,最後使用“+”把libxml2加入
|
範例
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSError* error; // 取得yahoo首頁的HTML NSData* data = [[NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.yahoo.com.tw"] encoding:NSUTF8StringEncoding error:&error] dataUsingEncoding:NSUTF8StringEncoding]; // 取出title標籤中的值 TFHpple* parser = [[TFHpple alloc] initWithHTMLData:data]; NSArray* values = [parser searchWithXPathQuery:@"//title"]; // get the title TFHppleElement* value = [values objectAtIndex:0]; NSString* result = [value content]; NSLog(@"result = %@", result); mLabel.text = result; } |
問題
訂閱:
意見 (Atom)











