2013-08-31 15 views
5
-(void)getDataFromServer: (NSMutableDictionary *)dict 
{ 

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/doSomething",MainURL ]]; 
[AFJSONRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"text/html"]]; 

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; 
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:nil parameters:dict]; 

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) 
{ 
    _myArray = JSON; 
    [_myTableView reloadData]; //Or do some other stuff that are related to the current `ViewController` 
} 
failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON) 
{ 
    NSLog(@"request: %@",request); 
    NSLog(@"Failed: %@",[error localizedDescription]); 
}]; 

[httpClient enqueueHTTPRequestOperation:operation]; 
} 

Yukarıdaki kodları, uygulamalarımın birinde 7 farklı yerde kullanıyorum. Kodun tam yığını, ViewControllers'umun 7'sinde yineleniyor. Normalde yapmak istediğim, bir NSObject sınıfında kullanmak istediğim yöntemi koymak ve gerektiğinde onu ayırmak ve kullanmaktır, ancak yukarıdaki Async ve blokları kullanıyorum çünkü JSON'u ViewController numaralı telefona geri gönderemiyorum. o ve & ben bunu gereken her ViewController yukarıdaki yöntemi kopyalayıp yapıştırın gerekiyor.Blokları AFNetworking yöntemine mi geçirdiniz?

Amacım uygulamasında yalnızca tek bir yerde yukarıda var ve hala benim app etrafında farklı ViewControllers onu aramak mümkün ve olmaktır ihtiyacım olan verileri al. NSNotification veya KVO gibi bir gözlemci kullanmaktan ve daha zarif bir çözüm aramaktan kaçınmak istiyorum. Bazı okumalardan sonra etrafta blok geçirme olasılığını fark ettim. Yukarıdaki ile olası bir çözüm mü? Bir kod örneği takdir edilecektir.

+1

Gabriele'nin aşağıdaki yanıtına ek olarak, her istek için yeni bir AFHTTPClient döndürmekten kaçınmak isteyebilirsiniz. –

+0

Cevabımı tam olarak bunun için düzenliyordum. Not için teşekkürler. –

cevap

6

çarpanlarına Sen XYAPI gibi bir yardımcı sınıfında bu yöntemi yerleştirin ve sadece Ayrıca

[XYAPI getDataFromServer:params completion:^(id JSON){ 
    // do something, for instance reload the table with a new data source 
    _myArray = JSON; 
    [_myTableView reloadData]; 
} failure:^(NSError * error) { 
    // do something 
}]; 

gereksinim duymadığınız gibi denetleyicileri onu çağırabilir

+ (void)getDataFromServerWithParameters:(NSMutableDictionary *)params completion:(void (^)(id JSON))completion failure:(void (^)(NSError * error))failure { 
    NSString * path = @"resources/123"; 
    NSMutableURLRequest *request = [self.httpClient requestWithMethod:@"POST" path:path parameters:params]; 
    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
     if (completion) 
      completion(JSON); 
    } failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON) { 
     if (failure) 
      failure(error); 
    }]; 

    [httpClient enqueueHTTPRequestOperation:operation]; 
} 

gibi bir şeye API çağrısı Her istekte yeni bir AFHTTPClient üretmek için. XYAPI sınıfında paylaşılan bir yapılandırın ve kullanın.

Bir şey bu uygulamanın yukarıdaki örnekte zaten kullanıldığını unutmayın.
self bir sınıf yöntemi bağlamında sınıfın kendisi, bu nedenle self.httpClient gerçekten çalışma zamanında [XYAPI httpClient] olarak çözülür.

+0

Harika cevap! Çok detaylı ve güzel yazılı. Test edip raporlarım. Çok teşekkürler. – Segev