一個在我的應用程序的要求是這樣的:通用API請求處理
-(void)login
{
@try {
NSString *str = [NSString stringWithFormat:TGURL_LOGIN];
NSURL *url = [NSURL URLWithString:str];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
NSDictionary *requestData = @{@"---": ----,
@"---": ----,
@"OutResponse": [NSNumber numberWithInteger:0]};
NSError *error;
NSData *postData = [NSJSONSerialization dataWithJSONObject: requestData options:0 error:&error];
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[postData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setHTTPBody:postData];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
__block int iSuccess = 0;
[NSURLConnection
sendAsynchronousRequest:request
queue:queue
completionHandler:^(NSURLResponse *response,
NSData *data,
NSError *error) {
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
if ([data length] >0 && error == nil){
dispatch_async(dispatch_get_main_queue(), ^{
iSuccess = [self parseResponse:data];
});
dispatch_async(dispatch_get_main_queue(), ^{
if(iSuccess == 1)
{
[[NSUserDefaults standardUserDefaults] setObject:_email.text forKey:@"EmailText"];
[[NSUserDefaults standardUserDefaults] setObject:_password.text forKey:@"PasswordText"];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"User_Logged_In"];
[[NSUserDefaults standardUserDefaults]synchronize];
[TGProjectHandler saveCookiesToDefaults];
[self getUserID];
}
else if(iSuccess == 3)
{
[[NSUserDefaults standardUserDefaults] setObject:_email.text forKey:@"EmailText"];
[[NSUserDefaults standardUserDefaults] setObject:_password.text forKey:@"PasswordText"];
[[NSUserDefaults standardUserDefaults]synchronize];
[self.view endEditing:YES];
[TGProjectHandler saveCookiesToDefaults];
[TGProjectHandler removeLoadingIndicator];
[self performSegueWithIdentifier:@"ShowJoinGroup" sender:nil];
}
else
{
[[[UIAlertView alloc] initWithTitle: NSLocalizedString(@"Login_failed", nil)
message:NSLocalizedString(@"Invalid_credentials", nil)
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil] show];
[TGProjectHandler removeLoadingIndicator];
self.view.userInteractionEnabled = YES;
}
});
}
else if ([data length] == 0 && error == nil){
NSLog(@"Empty Response, not sure why?");
}
else if (error != nil){
NSLog(@"%@", error.description);
self.view.userInteractionEnabled = YES;
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Login_failed", nil)
message:error.localizedDescription
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil] show];
[TGProjectHandler removeLoadingIndicator];
self.view.userInteractionEnabled = YES;
}
}];
}
@catch (NSException *exception) {
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
}
}
這僅僅是一個服務調用的一個。有幾百個人。目前我正在寫這些控制器本身(壞方法,我知道:))。
我正在尋找一種方法,我可以在一個類中編寫所有基於請求的代碼,並隨處訪問它。
我想了一下創建Singleton。但我不確定爲此創建Singleton。
還想過創建一個協議,但最後我不得不在控制器中實現它。
我可以使用哪些不同的模式,以便我可以在任何地方重複使用代碼。
你可以嘗試創建一個NSObject類,在那裏你可以聲明websersevice post和get方法。您只需將webservice名稱和參數傳遞給該webservice類,並在需要該數據的類中獲取其響應。您可以爲web服務響應創建一個完成處理程序。 –
@RahulPatel:如何處理完成處理程序? – Nitish