2012年1月10日 星期二

iOS - ASIHTTPRequest

目的
  • 用於網路溝通
工具
使用範例
﹣欲下載網路圖片如下
圖片來源
﹣Code
.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];


  // 設定下載位址

  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

依紅框指示加入參數和library,以解除其它參考的錯誤

沒有留言:

張貼留言