我正在爲iphone和ipad構建一款新應用,我需要知道與我的API進行通信的最佳做法,通常我會在每個視圖中調用API 1或幾次。我發現我應該使用NSURLConnection
,但是特別是在處理多個連接時將代理分配給self
會使組織任務和連接成爲一個非常困難的非原始流程。iOS:網絡應用的最佳實踐
以前有人遇到過這個問題嗎?最佳做法是什麼?我應該創建1個類來處理所有的請求嗎?
感謝
我正在爲iphone和ipad構建一款新應用,我需要知道與我的API進行通信的最佳做法,通常我會在每個視圖中調用API 1或幾次。我發現我應該使用NSURLConnection
,但是特別是在處理多個連接時將代理分配給self
會使組織任務和連接成爲一個非常困難的非原始流程。iOS:網絡應用的最佳實踐
以前有人遇到過這個問題嗎?最佳做法是什麼?我應該創建1個類來處理所有的請求嗎?
感謝
儘管可以理解NSURLConnection的,(你會需要),就沒有必要重新發明輪子。
只需使用AFNetworking。它是異步的,易於使用,並且您可以獲得很好的額外功能,例如狀態欄中的網絡活動微調器可以顯示網絡活動時間。
前段時間我已經經歷過這個教條&解決方案是使用塊& AFNetworking。
使用塊的優點是它允許從相同的控制器調用相同的API,而不需要區分每個調用,因爲每個調用都有自己的塊來執行。
如果您需要這種應用程序的完整體系結構,只需使用基本的OOP原理,將網絡通信邏輯分離爲一個單一類(AFHTTPClient的擴展),然後如果數據密集型應用程序或否則控制器。
我創建的示例客戶端擴展如下。
#import <Foundation/Foundation.h>
#import <AFNetworking.h>
@interface CRLClient : AFHTTPClient
+ (CRLClient*) sharedClient;
+ (void) setBaseURL:(NSString*)url;
- (void) uploadFiles:(NSArray*)files
path:(NSString*)path
parameters:(NSDictionary*)parameters
progressBlock:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))block
success:(void (^)(AFHTTPRequestOperation *, id))success failure:(void (^)(AFHTTPRequestOperation *, NSError *))failure;
@end
#import "CRLClient.h"
@implementation CRLClient
static NSString *CRLBaseURL = nil;
+ (void) setBaseURL:(NSString*)url;
{
CRLBaseURL = [url copy];
}
+ (CRLClient*) sharedClient
{
static CRLClient* sharedInstance = nil;
// dispatch_once_t dispOnce;
@synchronized (sharedInstance) {
if (!sharedInstance) {
// dispatch_once(&dispOnce, ^{
sharedInstance = [[CRLClient alloc] initWithBaseURL:[NSURL URLWithString:CRLBaseURL]];
}
// });
}
return sharedInstance;
}
- (id)initWithBaseURL:(NSURL *)url {
self = [super initWithBaseURL:url];
if (!self) {
return nil;
}
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];
[self setDefaultHeader:@"Accept" value:@"application/json"];
self.parameterEncoding = AFJSONParameterEncoding;
return self;
}
- (void) uploadFiles:(NSArray*)files
path:(NSString*)path
parameters:(NSDictionary*)parameters
progressBlock:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite))block
success:(void (^)(AFHTTPRequestOperation *, id))success failure:(void (^)(AFHTTPRequestOperation *, NSError *))failure
{
NSMutableURLRequest *request =
[self multipartFormRequestWithMethod:@"POST"
path:path
parameters:parameters
constructingBodyWithBlock:
^(id <AFMultipartFormData>formData) {
for (CRLMultiPartFile *file in files) {
NSAssert(file.name, @"Name cannot be nil");
NSAssert(file.file, @"Nothing found to upload");
NSAssert(file.filename, @"FileName cannot be nil");
NSAssert(file.mimeType, @"Must set Mime-Type for %@", file.filename);
[formData appendPartWithFileData:file.file name:file.name fileName:file.filename mimeType:file.typeString];
}
}];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[operation setUploadProgressBlock:block];
[operation setCompletionBlockWithSuccess:success failure:failure];
[self enqueueHTTPRequestOperation:operation];
}
我同意Abizem的看法,AFNetworking是一個很棒的第三方庫,可以簡化網絡管理。如果您有興趣瞭解一些網絡概念,您還可以觀看[WWDC 2012 - 網絡最佳實踐](https://developer.apple.com/videos/wwdc/2012/?id=706)。坦率地說,這段視頻將會讓你感受到你可能不想擔心的雜草,以及哪些AFNetworking可以讓你擺脫困境,但如果你對背景感興趣,那很有趣。 – Rob 2013-04-25 03:27:02