AFNetworking

Restful ကို လွယ်လွယ် ကူကူ အသုံးပြုနိုင် သည့် Network Library Framework
ရေးသားသူ : saturngod

iOS app တွေရေးတဲ့ အခါမှာ ကျွန်တော်တို့ အနေနဲ့ Restful ကနေ JSON file ကို NSURLConnection နဲ့ Async ရေးကြပါတယ်။ နောက်ပြီးတော့ Delegate နဲ့ ပြန်ပြီးတော့ NSData ကို သိမ်းရတယ်။ ပြီးမှ NSData ကနေ NSString ကို ပြန်ပြီးတော့ ပြောင်းရတယ်။ ရလာတဲ့ NSString က JSON String ဖြစ်နေတဲ့အတွက်ကြောင့် NSDictionary သို့မဟုတ် NSArray ကို ပြန်ပြောင်းပြီးမှ လိုချင်တဲ့ data ကို ရပါတယ်။ ကျွန်တော်တို့တွေ Restful API ကို သုံးတဲ့အခါမှာ လွယ်လွယ်ကူကူနဲ့ code ရှင်းရှင်းလင်းလင်း ဖြစ်သွားအောင် AFNetworking ကို အသုံးပြုနိုင်ပါတယ်။

AFNetworking ဆိုတာ ဘာလဲ

AFNetworking ဆိုတာ iOS နဲ့ OS X တို့အတွက် networking framework တစ်ခုပါ။ NSURLConnection, NSOperation တို့ကို အသုံးပြုပြီး ရေးထားတဲ့ framework ပါ။ AFNetworking framework ကို အသုံးပြုပြီးတော့ networking code တွေကို လွယ်လွယ်ကူကူ ရေးလို့ရလာပါတယ်။

ဥပမာ။

NSURL *url = [NSURL URLWithString:@"https://alpha-api.app.net/stream/0/posts/stream/global"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSLog(@"App.net Global Stream: %@", JSON);
} failure:nil];
[operation start];

Block ကို အသုံးပြုထားတဲ့ အတွက် သုံးရတာ ပုံမှန် NSURLConnection ထက် အများကြီး လွယ်ကူပါတယ်။ ဒါ့အပြင် ရလာတဲ့ JSON string ကို NSDictionary သို့မဟုတ် NSArray အလိုအလျောက် ပြောင်းပေးပါတယ်။

AFNetworking ဟာ opensource ဖြစ်ပြီး နေ့စဉ်နီးပါး developers တွေ ဝိုင်းပြီးတော့ update လုပ်နေကြတဲ့ framework တစ်ခုဖြစ်ပါတယ်။ လက်ရှိ အချိန်မှာ လူသုံးများတဲ့ framework တစ်ခုဆိုလည်း မမှားပါဘူး။

AFNetworking

Requirement

AFNetworking ကို အသုံပြုဖို့ iOS 5.0 သို့မဟုတ် သူ့အထက် version လိုအပ်ပါတယ်။ Mac OS 10.7 နှင့်အထက် လည်း အသုံးပြုနိုင်ပါတယ်။ iOS 4.3 နဲ့ သုံးချင်တယ်ဆိုရင် version 0.10.x ကို အသုံးပြုမှ ရပါတယ်။ AFNetwork ဟာ ARC ကို အသုံးပြုထားပါတယ်။

Example

XML Request

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://api.flickr.com/services/rest/?method=flickr.groups.browse&api_key=b6300e17ad3c506e706cb0072175d047&cat_id=34427469792%40N01&format=rest"]];

AFXMLRequestOperation *operation = [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, NSXMLParser *XMLParser) {
XMLParser.delegate = self;
[XMLParser parse];
} failure:nil];
[operation start];

Image Request

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]];

API Client Request

// AFAppDotNetAPIClient is a subclass of AFHTTPClient, which defines the base URL and default HTTP headers for NSURLRequests it creates
[[AFAppDotNetAPIClient sharedClient] getPath:@"stream/0/posts/stream/global" parameters:nil success:^(AFHTTPRequestOperation *operation, id JSON) {
NSLog(@"App.net Global Stream: %@", JSON);
} failure:nil];

File Upload with Progress Callback

NSURL *url = [NSURL URLWithString:@"http://api-base-url.com"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"avatar.jpg"], 0.5);
NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:@"/upload" parameters:nil constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) {
[formData appendPartWithFileData:imageData name:@"avatar" fileName:@"avatar.jpg" mimeType:@"image/jpeg"];
}];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite);
}];
[httpClient enqueueHTTPRequestOperation:operation];

Streaming Request

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:8080/encode"]];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.inputStream = [NSInputStream inputStreamWithFileAtPath:[[NSBundle mainBundle] pathForResource:@"large-image" ofType:@"tiff"]];
operation.outputStream = [NSOutputStream outputStreamToMemory];
[operation start];

လက်တွေ့ အသုံးချထားတဲ့ ဥပမာ ကိုတော့ သူ့ရဲ့ Example Project ကို ကြည့်နိုင်ပါတယ်။ သူက App.net API ကို အသုံးပြုထားပြီးတော့ ပြထားပါတယ်။ AFHTTPClient ကို အသုံးပြုပြီးတော့ Object ဆောက်ထားပါတယ်။ သူ့ရဲ့ Example Project က လေ့လာစရာတွေ အများကြီးပါပါတယ်။ MVC ကို ဘယ်လိုရေးသင့်လဲ။ Network Layer ဘယ်လို ခွဲပြီး ရေးသင့်တယ်ဆိုတာကို လေ့လာနိုင်ပါတယ်။