mknetworkkit上傳圖片
A. 如何改進iOS App的離線使用體驗
打開過的文章、下載過的音頻、查看過的圖片我們都希望Cache到本地,下次不用再向伺服器請求。
首先,我們為了最快讓用戶看到內容,會在ViewDidLoad載入Cache數據,如:
- (void)viewDidLoad {
[self getArticleList:0 length:SECTION_LENGTH useCacheFirst:YES];
}
然後在viewDidAppear中向伺服器請求最新數據,如
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
//...
[self getArticleList:0 length:SECTION_LENGTH useCacheFirst:NO]
}
當然這里的getArticleList介面有useCacheFirst參數,我們需要網路請求模塊能夠支持這一點,下面就介紹這些庫和工具。
(藉助一些工具很容易能做到這些,而不用自己造輪子。遵循「凡事都應該最簡單,而不過於簡陋」的原則,這里整理一下,方便項目中使用)。
1.NSMutableURLRequest
Sample(參考麒麟的文章《iOS開發之緩存(一):內存緩存》來使用NSURLCache):
NSString *paramURLAsString= @"http://www..com/";
if ([paramURLAsString length] == 0){
NSLog(@"Nil or empty URL is given");
return;
}
NSURLCache *urlCache = [NSURLCache sharedURLCache];
/* 設置緩存的大小為1M*/
[urlCache setMemoryCapacity:1*1024*1024];
//創建一個nsurl
NSURL *url = [NSURL URLWithString:paramURLAsString];
//創建一個請求
NSMutableURLRequest *request =
[NSMutableURLRequest
requestWithURL:url
cachePolicy:
timeoutInterval:60.0f];
//從請求中獲取緩存輸出
NSCachedURLResponse *response =
[urlCache cachedResponseForRequest:request];
//判斷是否有緩存
if (response != nil){
NSLog(@"如果有緩存輸出,從緩存中獲取數據");
[request setCachePolicy:];
}
self.connection = nil;
/* 創建NSURLConnection*/
NSURLConnection *newConnection =
[[NSURLConnection alloc] initWithRequest:request
delegate:self
startImmediately:YES];
self.connection = newConnection;
[newConnection release];
但是NSMutableURLRequest使用起來不夠簡便,在實際項目中我很少用它,而基本使用ASIHTTPRequest來代替。
2.ASIHTTPRequest
你可以從這里找到它的介紹:http://allseeing-i.com/ASIHTTPRequest/,在5.0/4.0及之前iOS版本,ASIHTTPRequest基本是主力的 HTTP requests library,它本身也是Github中的開源項目,但是從iOS 5.0之後逐漸停止維護了。未來的項目可以使用AFNetworking或者MKNetworkKit代替ASIHTTPRequest。
ASIHTTPRequest的簡介如下:
ASIHTTPRequest is an easy to use wrapper around the CFNetwork API
that makes some of the more tedious aspects of communicating with web
servers easier. It is written in Objective-C and works in both Mac OS X
and iPhone applications.
It is suitable performing basic HTTP requests and interacting with
REST-based services (GET / POST / PUT / DELETE). The included
ASIFormDataRequest subclass makes it easy to submit POST data and files
usingmultipart/form-data.
ASIHTTPRequest庫API設計的簡單易用,並且支持block、queue、gzip等豐富的功能,這是該開源項目如此受歡迎的主要原因。
ASIHTTPRequest庫中提供了ASIWebPageRequest組件用於請求網頁,並且能把網頁中的外部資源一並請求下來,但是我在實際項目中使用後發現有嚴重Bug,所以不建議使用。
ASIHTTPRequest庫的介紹中也提到了它可以支持REST-based service,但是與Restfull API打交道我們往往使用下面介紹的的RestKit。
Sample:
NSMutableString *requestedUrl = [[NSMutableString alloc] initWithString:self.url];
//如果優先使用本地數據
ASICachePolicy policy = _useCacheFirst ?
: ( | );
asiRequest = [ASIHTTPRequest requestWithURL:
[NSURL URLWithString:[requestedUrl :NSUTF8StringEncoding]]];
[asiRequest setDownloadCache:[ASIDownloadCache sharedCache]];
[asiRequest setCachePolicy:policy];
[asiRequest setCacheStoragePolicy:];
// Connection
if (_connectionType == ConnectionTypeAsynchronously) {
[asiRequest setDelegate:self];
[asiRequest startAsynchronous];
// Tell we're receiving.
if (!_canceled && [_delegate respondsToSelector:@selector(downloaderDidStart:)])
[_delegate downloaderDidStart:self];
}
else
{
[asiRequest startSynchronous];
NSError *error = [asiRequest error];
if (!error)
{
[self requestFinished:asiRequest];
}
else
{
[self requestFailed:asiRequest];
}
}
[requestedUrl release];
3.RestKit
官方網站:http://restkit.org/,Github開源項目,與 Restfull API 的 Web服務打交道,這個庫非常便捷,它也提供了很完整的Cache機制。
Sample:
+ (void)setCachePolicy:(BOOL)useCacheFirst
{
RKObjectManager* objectManager = [RKObjectManager sharedManager];
if (useCacheFirst) {
objectManager.client.cachePolicy = RKRequestCachePolicyEnabled; //使用本地Cache,如果沒有Cache請求伺服器
}
else
{
objectManager.client.cachePolicy = |RKRequestCachePolicyTimeout; //離線或者超時時使用本地Cache
}
}
+ (BOOL)getHomeTimeline:(NSInteger)maxId
length:(NSInteger)length
delegate:(id<RKObjectLoaderDelegate>)delegate
useCacheFirst:(BOOL)useCacheFirst
{
if (delegate == nil)
return NO;
[iKnowAPI setCachePolicy:useCacheFirst];
//...
}
Cache請求只是RestKit最基本的功能,RestKit真正強大的地方在於處理與RESTful web services交互時的相關工作非常簡便(https://github.com/RestKit/RestKit/wiki),RestKit還可以Cache data model到Core Data中:
Core Data support. Building on top of the object mapping layer,
RestKit provides integration with Apple's Core Data framework. This
support allows RestKit to persist remotely loaded objects directly back
into a local store, either as a fast local cache or a primary data store
that is periodically synced with the cloud. RestKit can populate Core
Data associations for you, allowing natural property based traversal of
your data model. It also provides a nice API on top of the Core Data
primitives that simplifies configuration and querying use cases through
an implementation of the Active Record access pattern.
但實際上RKRequestCachePolicy已經解決了大部分Cache需求。
4.SDWebImage
SDWebImage是Github開源項目:https://github.com/rs/SDWebImage,它用於方便的請求、Cache網路圖片,並且請求完畢後交由UIImageView顯示。
Asynchronous image downloader with cache support with an UIImageView category.
SDWebImage作為UIImageView的一個Category提供的,所以使用起來非常簡單:
// Here we use the new provided setImageWithURL: method to load the web image
[imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
AFNetworking也提供了類似功能(UIImageView+AFNetworking):
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"]];
5.UIWebView中的圖片Cache
如果你使用UIWebView來展示內容,在離線情況下如果也想能顯示的話需要實現2點:
Cache Html頁面
Cache 圖片等元素
使用上面介紹的網路組件來Cache Html頁面比較便捷,之後使用webView
loadHTMLString即可載入本地Html頁面,而Cache圖片需要更換NSURLCache公共實例為自定義的
NSURLCache(UIWebView使用的即是+[NSURLCache sharedURLCache]):
//設置使用自定義Cache機制
LocalSubstitutionCache *cache = [[[LocalSubstitutionCache alloc] init] autorelease];
[cache setMemoryCapacity:4 * 1024 * 1024];
[cache setDiskCapacity:10 * 1024 * 1024];
[NSURLCache setSharedURLCache:cache];
自定義NSURLCache:
#import <Foundation/Foundation.h>
@interface LocalSubstitutionCache : NSURLCache
{
NSMutableDictionary *cachedResponses;
}
+ (NSString *)pathForURL:(NSURL*)url;
@end
B. ios afnetworking怎麼用post請求追加參數
隨著asihttprequest的停止更新,許多人都轉向了AFNetworking、 MKNetworkKit.我也是其中一個。於是我從網上找了許多文章作參考,但是結果都是失敗告終。研究了好久都搞不透,最後還是請人幫忙搞定了。經常從網上索取免費資料的一員,要有回報的思想,也為了讓更多的人少走些彎路,所以下面是代碼:(有錯誤可以指出)
首先:將AFNetworking、UIKit+AFNetworking 加入到工程
然後在要使用的地方
#import "AFHTTPRequestOperationManager.h"
#import "AFHTTPSessionManager.h"
AFHTTPRequestOperationManager的post有兩個方法,一個是普通的post,另一個是可以上傳圖片的
1.上傳圖片:
AFHTTPRequestOperationManager *manager = [];
manager.responseSerializer.acceptableContentTypes = [NSSetsetWithObject:@"text/html"];
NSDictionary *parameters =@{@"參數1":@"value1",@"參數2":@"value2"、、、};
NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"1.png"], 1.0);
[manager POST:@"替換成你要訪問的地址"parameters::^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileData :imageData name:@"1" fileName:@"1.png" mimeType:@"image/jpeg"];
} success:^(AFHTTPRequestOperation *operation,id responseObject) {
NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation,NSError *error) {
NSLog(@"Error: %@", error);
}];
這個方法可以上傳圖片,如果不用上傳圖片,可以把這句去掉[formData appendPartWithFileData :imageDataname:@"1"fileName:@"1.png"mimeType:@"image/jpeg"]
2.普通的post
AFHTTPRequestOperationManager *manager = [];
manager.responseSerializer.acceptableContentTypes = [NSSetsetWithObject:@"text/html"];
NSDictionary *parameters = @{@"參數1":@"value1",@"參數2":@"value2"、、、};
[managerPOST:@"替換成你要訪問的地址"parameters:parameters
success:^(AFHTTPRequestOperation *operation,id responseObject) {
NSLog(@"Success: %@", responseObject);
}failure:^(AFHTTPRequestOperation *operation,NSError *error) {
NSLog(@"Error: %@", error);
}];
可以參考一下。AFNetworking-2.0.3
C. 鏂頒漢奼傚姪afnetworking post璇鋒眰鐨刣emo
闅忕潃asihttprequest鐨勫仠姝㈡洿鏂幫紝璁稿氫漢閮借漿鍚戜簡AFNetworking銆 MKNetworkKit.鎴戜篃鏄鍏朵腑涓涓銆備簬鏄鎴戜粠緗戜笂鎵句簡璁稿氭枃絝犱綔鍙傝冿紝浣嗘槸緇撴灉閮芥槸澶辮觸鍛婄粓銆傜爺絀朵簡濂戒箙閮芥悶涓嶉忥紝鏈鍚庤繕鏄璇蜂漢甯蹇欐悶瀹氫簡銆傜粡甯鎬粠緗戜笂緔㈠彇鍏嶈垂璧勬枡鐨勪竴鍛橈紝瑕佹湁鍥炴姤鐨勬濇兂錛屼篃涓轟簡璁╂洿澶氱殑浜哄皯璧頒簺寮璺錛屾墍浠ヤ笅闈㈡槸浠g爜錛氾紙鏈夐敊璇鍙浠ユ寚鍑猴級
棣栧厛錛氬皢AFNetworking銆乁IKit+AFNetworking 鍔犲叆鍒板伐紼
鐒跺悗鍦ㄨ佷嬌鐢ㄧ殑鍦版柟
#import "AFHTTPRequestOperationManager.h"
#import "AFHTTPSessionManager.h"
AFHTTPRequestOperationManager鐨刾ost鏈変袱涓鏂規硶錛屼竴涓鏄鏅閫氱殑post,鍙︿竴涓鏄鍙浠ヤ笂浼犲浘鐗囩殑
1.涓婁紶鍥劇墖錛
AFHTTPRequestOperationManager *manager = [];
manager.responseSerializer.acceptableContentTypes = [NSSetsetWithObject:@"text/html"];
NSDictionary *parameters =@{@"鍙傛暟1":@"value1",@"鍙傛暟2":@"value2"銆併併亇;
NSData *imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"1.png"], 1.0);
[manager POST:@"鏇挎崲鎴愪綘瑕佽塊棶鐨勫湴鍧"parameters::^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileData :imageData name:@"1" fileName:@"1.png" mimeType:@"image/jpeg"];
} success:^(AFHTTPRequestOperation *operation,id responseObject) {
NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation,NSError *error) {
NSLog(@"Error: %@", error);
}];
榪欎釜鏂規硶鍙浠ヤ笂浼犲浘鐗囷紝濡傛灉涓嶇敤涓婁紶鍥劇墖錛屽彲浠ユ妸榪欏彞鍘繪帀[formData appendPartWithFileData :imageDataname:@"1"fileName:@"1.png"mimeType:@"image/jpeg"]
2.鏅閫氱殑post
AFHTTPRequestOperationManager *manager = [];
manager.responseSerializer.acceptableContentTypes = [NSSetsetWithObject:@"text/html"];
NSDictionary *parameters = @{@"鍙傛暟1":@"value1",@"鍙傛暟2":@"value2"銆併併亇;
[managerPOST:@"鏇挎崲鎴愪綘瑕佽塊棶鐨勫湴鍧"parameters:parameters
success:^(AFHTTPRequestOperation *operation,id responseObject) {
NSLog(@"Success: %@", responseObject);
}failure:^(AFHTTPRequestOperation *operation,NSError *error) {
NSLog(@"Error: %@", error);
}];
鍙浠ュ弬鑰冧竴涓嬨侫FNetworking-2.0.3
D. iOS開發包含哪些內容
環境:Mac系統自帶的OSX系統,黑蘋果或者虛擬機也可以。編譯環境為Xcode。語言:objective—C語言和Swift語言。學習objective—C還是swift,這要視情況而定。如果你要把學習iOS開發當做一個業余愛好,那麼從swift語言開始學起吧。swift是一種現代語言,相對於Objective—C來說,也更加簡單好學。你可以直接學習蘋果發布的官方的swift文檔(中文版)就ok。但是,如果你將從事iOS開發為職業,那最好是選擇學習Objective—C。要知道目前的絕大多數應用都是用objective—C開發的。swift語言在2014年才正式發布。目前以swift語言為主要開發語言的公司還不多。完全零基礎的小白想系統學習Objective—C,可以學習我贏職場的iOS開發教程,這款教程很經典。其中Objective—C部分是完全免費的。我贏職場iOS實戰開發工程師(Swift/Apple Watch/PHP)其實,不管你選擇哪一門語言,學到最後你將發現,只要學會iOS SDK,使用哪種語言並不是很重要。學了一種語言之後,對於學習另一門語言也會變得更加容易。工具:iOS開發工具多如牛毛,這里整理了對開發者有幫助的5個iOS編程工具,當然作為新手的話,這些工具完全沒有必要接觸。能把Xcode玩熟練已經不錯了。
1、名稱:CodeRunner CodeRunner是一款輕量級,可以編寫和運行多種語言的編輯器,它不需要安裝額外的語言環境就可以執行多種語言代碼。如果開發者想要測試一段代碼或者一個API具體的功能,用Xcode未免過於麻煩,而CodeRunner卻恰巧彌補了Xcode在這方面的欠缺。開發者只需要在CodeRunner中編寫一個短小的代碼片段,即可測試代碼和API的具體功能。此外,CodeRunner能加快開發者的編程速度,所以開發者可以在很短的時間內完成代碼編寫工作,通過CodeRunner測試無誤後,就可以把它拷貝回Xcode的項目中,極大地提高了開發者的工作效率。
2、名稱:AppCode,AppCode是全新的Objective-C的IDE集成開發環境,旨在幫助開發者開發Mac OS X和iOS系統的相關應用程序。