? ? ? ?為了學習這些API的用法,我們選擇用MyNotes應用案例來做講解,這次數據來源是Notes.xml文件。我們首先實現查詢業務,查詢業務請求可以在主視圖控制器MasterViewController類中實現,MasterView-Controller中的主要相關代碼如下:
? ? ? ?class MasterViewController: UITableViewController {
? ? ? ?//保存數據列表
? ? ? ?var objects = NSMutableArray()
? ? ? ?override func viewDidLoad() {
? ? ? ?......
? ? ? ?self.startRequest() ①
? ? ? ?}
? ? ? ?......
? ? ? ?//開始請求Web Service
? ? ? ?func startRequest() {
? ? ? ?var strURL = NSString(format: "http://www.51work6.com/service/mynotes/
? ? ? ?WebService.php?email=%@&type=%@&action=%@", "<你的51work6.com
? ? ? ?用戶郵箱>","JSON", "query") ②
? ? ? ?strURL =strURL.stringByAddingPercentEscapesUsingEncoding
? ? ? ?(NSUTF8StringEncoding)! ③
? ? ? ?let url = NSURL(string: strURL)!
? ? ? ?var request = NSURLRequest(URL: url)
? ? ? ?var error: NSError?
? ? ? ?var data = NSURLConnection.sendSynchronousRequest(request,
? ? ? ?returningResponse: nil, error: &error)! ④
? ? ? ?if error != nil {
? ? ? ?NSLog("請求失敗")
? ? ? ?} else {
? ? ? ?var resDict = NSJSONSerialization.JSONObjectWithData(data,
? ? ? ?options: NSJSONReadingOptions.AllowFragments,
? ? ? ?error: nil) as NSDictionary!
? ? ? ?self.reloadView(resDict) ⑤
? ? ? ?}
? ? ? ?NSLog("請求完成...")
? ? ? ?}
? ? ? ?//MARK: --處理通知
? ? ? ?func reloadView(res : NSDictionary) {
? ? ? ?let resultCode: NSNumber = res.objectForKey("ResultCode") as
? ? ? ?NSNumber ⑥
? ? ? ?if (resultCode.integerValue >= 0) { //成功
? ? ? ?self.objects = res.objectForKey("Record") as NSMutableArray ⑦
? ? ? ?self.tableView.reloadData()
? ? ? ?} else {
? ? ? ?let errorStr = resultCode.errorMessage ⑧
? ? ? ?let alertView = UIAlertView(title: "錯誤信息", message: errorStr,
? ? ? ?delegate: nil, cancelButtonTitle: "OK")
? ? ? ?alertView.show()
? ? ? ?}
? ? ? ?}
? ? ? ?}
? ? ? ?//MasterViewController.m文件
? ? ? ?- (void)viewDidLoad
? ? ? ?{
? ? ? ?......
? ? ? ?[self startRequest]; ①
? ? ? ?}
? ? ? ?-(void)startRequest
? ? ? ?{
? ? ? ?NSString *strURL = [[NSString alloc] initWithFormat:@"JSON",
? ? ? ?@"query"]; ②
? ? ? ?strURL = [strURL stringByAddingPercentEscapesUsingEncoding:
? ? ? ?NSUTF8StringEncoding]; ③
? ? ? ?NSURL *url = [NSURL URLWithString:strURL];
? ? ? ?NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
? ? ? ?NSData *data = [NSURLConnection
? ? ? ?sendSynchronousRequest:request returningResponse:nil
? ? ? ?error:nil]; ④
? ? ? ?NSLog(@"請求完成...");
? ? ? ?NSDictionary *resDict = [NSJSONSerialization
? ? ? ?JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
? ? ? ?[self reloadView:resDict]; ⑤
? ? ? ?}
? ? ? ?//重新加載表視圖
? ? ? ?-(void)reloadView:(NSDictionary*)res
? ? ? ?{
? ? ? ?NSNumber *resultCode = [res objectForKey:@"ResultCode"]; ⑥
? ? ? ?if ([resultCode integerValue] >=0)
? ? ? ?{
? ? ? self.objects = [res objectForKey:@"Record"]; ⑦
? ? ? [self.tableView reloadData];
? ? ??} else {
? ? ? NSString *errorStr = [resultCode errorMessage]; ⑧
? ? ? UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"錯誤信息"
? ? ? message:errorStr
? ? ? delegate:nil
? ? ? cancelButtonTitle:@"OK"
? ? ? otherButtonTitles: nil];
? ? ? [alertView show];
? ? ? }
? ? ? }
? ? ? 其中第①行代碼調用自己的startRequest方法實現請求Web Service。在startRequest方法中,第②行是指定請求的URL。
? ? ? 第③行代碼使用NSString的stringByAddingPercentEscapesUsingEncoding:方法將字符串轉換為URL字符串。
? ? ? 在網上傳輸的時候,URL中不能有中文等特殊字符,比如特殊字符“<”必須進行URL編碼才能傳輸,“<”字符的URL編碼是“%3C”。
? ? ? 第④行代碼使用NSURLConnection的sendSynchronousRequest:returningResponse:error:方法進行請求,該方法是同步方法,返回值是NSData類型的數據。同步方法就是請求過程中線程堵塞到這里,直到Web Service返回應答為止。因此,同步方法的用戶體驗不好,為了改善用戶體驗,在iOS 5中增加了可以在其他線程中請求的同步方法。
? ? ? ?第⑤行代碼在請求完成時調用reloadView:方法,用于重新加載表視圖中的數據。在reloadView:方法中,第
? ? ? ?⑥行代碼用于返回ResultCode。在ResultCode大于等于0時,說明在服務器端操作成功。
? ? ? ?第⑦行代碼用于取得從服務器端返回的數據。
? ? ? ?從服務器返回的JSON格式數據有兩種情況,一種是成功返回,相關代碼如下:
? ? ? ?{"ResultCode":0,"Record":[{"ID":1,"CDate":"2012-12-23","Content":
? ? ? ?"這只是一條測試數據"}]}
? ? ? ?另一種是失敗返回,相關代碼如下:
? ? ? ?{"ResultCode":-1}
? ? ? ?其中ResultCode數據項說明調用Web Service的結果。為了減少網絡傳輸,我們只傳遞消息代碼,不傳遞消息內容。第⑧行代碼根據結果編碼獲得結果消息,這里使用NSNumber擴展技術(Objective-C中稱為分類),本例中我們定義的NSNumber擴展是NSNumber+Message,具體代碼如下:
? ? ? ?import Foundation
? ? ? ?extension NSNumber {
? ? ? ?var errorMessage : String {
? ? ? ?var errorStr = ""
? ? ? ?switch (self) {
? ? ? ?case -7:
? ? ? ?errorStr = "沒有數據。"
? ? ? ?case -6:
? ? ? ?errorStr = "日期沒有輸入。"
? ? ? ?case -5:
? ? ? ?errorStr = "內容沒有輸入。"
? ? ? ?case -4:
? ? ? ?errorStr = "ID沒有輸入。"
? ? ? ?case -3:
? ? ? ?errorStr = "數據訪問失敗。"
? ? ? ?case -2:
? ? ? ?errorStr = "您的賬號最多能插入10條數據。"
? ? ? ?case -1:
? ? ? ?errorStr = "用戶不存在,請到www.51work6.com注冊。"
? ? ? ?default:
? ? ? ?errorStr = ""
? ? ? ?}
? ? ? ?return errorStr
? ? ? ?}
? ? ? ?}
? ? ? ?//NSNumber+Message.h文件
? ? ? ?#import
? ? ? ?@interface NSNumber (Message)
? ? ? ?-(NSString *)errorMessage;
? ? ? ?@end
? ? ? ?//NSNumber+Message.m文件
? ? ? ?@implementation NSNumber (Message)
? ? ? ?-(NSString *)errorMessage
? ? ? ?{
? ? ? ?NSString *errorStr = @"";
? ? ? ?switch ([self integerValue]) {
? ? ? ?case -7:
? ? ? ?errorStr = @"沒有數據。";
? ? ? ?break;
? ? ? ?case -6:
? ? ? ?errorStr = @"日期沒有輸入。";
? ? ? ?break;
? ? ? ?case -5:
? ? ? ?errorStr = @"內容沒有輸入。";
? ? ? ?break;
? ? ? ?case -4:
? ? ? ?errorStr = @"ID沒有輸入。";
? ? ? ?break;
? ? ? ?case -3:
? ? ? ?errorStr = @"數據訪問失敗。";
? ? ? ?break;
? ? ? ?case -2:
? ? ? ?errorStr = @"您的賬號最多能插入10條數據。";
? ? ? ?break;
? ? ? ?case -1:
? ? ? ?errorStr = @"用戶不存在,請到http://51work6.com注冊。";
? ? ? ?default:
? ? ? ?break;
? ? ? ?}
? ? ? ?return errorStr;
? ? ? ?}
? ? ? ?@end
? ? ? ?NSNumber擴展中的代碼很簡單,南昌APP開發公司小編就不在多做介紹了。這里需要注意的是,如果返回的結果代碼小于0,說明操作就失敗了。
? ? ? ?以上就是百恒網絡為大家介紹的關于IOS同步GET請求的方法,如果大家還有哪些不明白的地方,可隨時來電和我們聯系,本公司專業為您解答。此外,如有需要南昌網站建設、APP開發、微信開發等方面的服務的朋友,百恒網絡隨時為您效勞!