0

私は iphone と ipad 用の新しいアプリを構築しています。API と通信するためのベスト プラクティスを知る必要があります。通常、各ビューで API を 1 回または数回呼び出します。私は使用する必要NSURLConnectionがあることを理解しましたが、複数の接続を処理するときにデリゲートをself特別に割り当てると、タスクと接続の整理が非常に難しくなり、組織化されていないプロセスになります。

以前にこの問題に直面した人はいますか? ベストプラクティスは何ですか?すべてのリクエストを処理するために 1 つのクラスを作成する必要がありますか?

ありがとう

4

2 に答える 2

5

NSURLConnection を理解することは役に立ちますが (理解する必要があります)、一からやり直す必要はありません。

AFNetworkingを使用するだけです。非同期で使いやすく、ネットワーク アクティビティがあるたびにステータス バーにネットワーク アクティビティ スピナーが表示されるなど、便利な機能が追加されています。

于 2013-04-25T03:10:02.300 に答える
0

私はかなり前にその教義を経験しており、解決策はブロックとAFNetworkingを使用しています。

ブロックを使用する利点は、各呼び出しを実行する独自のブロックがあるため、各呼び出しを区別する必要なく、同じコントローラーから同じ API を呼び出すことができることです。

このようなアプリの完全なアーキテクチャが必要な場合は、基本的な OOP 原則に従い、ネットワーク通信ロジックを 1 つのシングルトン クラス (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];
}
于 2013-04-25T04:54:11.807 に答える