2013-04-25 3 views
0

Я создаю новое приложение для iphone и ipad, мне нужно знать, как лучше всего общаться с моим API, обычно я буду называть API 1 или несколько раз в каждом представлении. Я понял, что должен использовать NSURLConnection, но назначая делегата self специально при обработке нескольких соединений, очень сложно организовать задачи и соединения, не связанные с процессом.iOS: лучшая практика для сетевого приложения

Кто-нибудь сталкивался с этой проблемой раньше? Какова наилучшая практика? должен ли я создать 1 класс для обработки всех запросов?

Благодаря

+1

Я согласен с Abizem в том, что AFNetworking - отличная сторонняя библиотека, которая упрощает управление сетью. Если вы заинтересованы в лучшем понимании некоторых сетевых концепций, вы также можете посмотреть [WWDC 2012 - Networking Best Practices] (https://developer.apple.com/videos/wwdc/2012/?id=706). Честно говоря, это видео перетащит вас через сорняки, о которых вы, вероятно, не хотите беспокоиться, и с которыми AFNetworking вас интересует, но если вы заинтересованы в фоновом режиме, это интересно. – Rob

ответ

5

Хотя это полезно понимать NSURLConnection, (и вам нужно) нет необходимости заново изобретать колесо.

Просто используйте AFNetworking. Он асинхронный, простой в использовании, и вы получаете приятные дополнения, такие как сетевой счетчик активности в строке состояния, показывающий, когда есть активность в сети.

0

Я прошел через эту догму некоторое время назад & решение использует блоки & AFNetworking.

Преимущество использования блоков заключается в том, что он позволяет вызывать один и тот же API от одного и того же контроллера, без необходимости различать каждый вызов, поскольку каждый вызов имеет собственный блок, который должен быть выполнен.

Если вам нужна полная архитектура такого приложения, просто переходите к основным принципам ООП, разделяя логику сети связи на один одноэлементный класс (расширение 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]; 
} 
Смежные вопросы