Swift-OC 单接口网络数据请求

主页面(须要导入OC的Reachability3.0第三方文件(须要导入桥接文件)

Bridging-Header.h  例:$(SRCROOT)/Swift -- 单接口/Bridging-Header.h)

let SCR_W = UIScreen.main.bounds.size.width

let SCR_H = UIScreen.main.bounds.size.height

// MARK: ------------------ 给UIViewController添加扩展 ------------

extension UIViewController {

 //MARK: ---------------- 包装的提示框 ------------------

 func showAlert(msg:String,sec:TimeInterval) {

 // 实例化弹出控制器

 let alertVC = UIAlertController(title: nil, message: msg, preferredStyle: .alert)

 // 从vc控制器弹出提示控制器

 self.present(alertVC, animated: true, completion: nil)

 //延时执行隐藏操作

 self.perform(#selector(hideAlertVC(sender:)), with: alertVC, afterDelay: sec)

    }


 //隐藏提示框

 @objc func hideAlertVC(sender:UIAlertController) {


sender.dismiss(animated: true, completion: nil)

    }

}

class RecipeViewController: UIViewController,UITextFieldDelegate {


 var recipeTF:UITextField? // 菜谱输入的输入框

 var searchBtn:UIButton? // 搜索按钮



 override func viewDidLoad() {

 super.viewDidLoad()


 // 设置View的背景色

 self.view.backgroundColor = UIColor.groupTableViewBackground

 recipeTF = UITextField(frame: CGRect(x: 0, y: 0, width: 200, height: 50))

 recipeTF?.center = CGPoint(x: SCR_W/2, y: SCR_H/2 - 150)

 recipeTF?.borderStyle = .line

 recipeTF?.placeholder = "请输入查询的菜谱"

 recipeTF?.textColor = UIColor.red

 recipeTF?.clearButtonMode = .whileEditing

 recipeTF?.textAlignment = .center

 recipeTF?.delegate = self

 self.view.addSubview(recipeTF!)


 searchBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 45))

 searchBtn?.center = CGPoint(x: SCR_W/2, y: SCR_H/2 - 45)

 searchBtn?.setTitle("点击查询", for: .normal)

 searchBtn?.backgroundColor = UIColor.blue

 searchBtn?.setTitleColor(UIColor.orange, for: .normal)

 searchBtn?.addTarget(self, action: #selector(searchBtnDidPress(sender:)), for: .touchUpInside)

 self.view.addSubview(searchBtn!)


    }


 //MARK: ---------------- 触摸回调 ---------------------

 @objc func searchBtnDidPress(sender:UIButton) {

 if (recipeTF?.text?.isEmpty)! {

 self.showAlert(msg: "信息不可为空", sec: 2.5)

 return

        }

 // 实例化结果控制器对象

 let resultVC = RecipeResultViewController()

 // 传递数据

resultVC.passString = recipeTF?.text

 //控制器跳转

 self.navigationController?.pushViewController(resultVC, animated: true)

    }

 //MARK: ---------------- UITextFieldDelegate ---------------

 // 点击return按钮触发回调

 func textFieldShouldReturn(_ textField: UITextField) -> Bool {

 // 放弃第一响应

        textField.resignFirstResponder()

 return true

    }


 //MARK: ---------------- Touches Methods ---------------

 override func touchesBegan(_ touches: Set, with event: UIEvent?) {

 super.touchesEnded(touches, with: event)

 recipeTF?.resignFirstResponder()

 // 将view及其子视图都放弃编辑,如果是TextField就收回键盘

 self.view.endEditing(true)

    }

}

网络数据获取及网络状态监测封装的model

class URLService: NSObject {

 //请求搜索的菜谱数据

 func getSearchRecipes(search:String,vc:UIViewController,completion:@escaping (Any,Bool)->Void) {

 // (1)判断无网络连接的情况

 if Reachability.forLocalWiFi().currentReachabilityStatus() == NotReachable && Reachability.forInternetConnection().currentReachabilityStatus() == NotReachable {

vc.showAlert(msg: "网络错误,请检查错误", sec: 2.5)

completion("error",false)

 return

        }

 //  (2)状态栏中的菊花开始转动

 UIApplication.shared.isNetworkActivityIndicatorVisible = true

 // (3)网址字符串封装

 let url = URL.init(string: "http://api.jisuapi.com/recipe/search")

 // (4)创建请求对象

 var req = URLRequest.init(url: url!, cachePolicy: .reloadRevalidatingCacheData, timeoutInterval: 15.0)

 //设置请求方式为POST

req.httpMethod = "POST"

 //将所有的参数拼接成一个字符串

 let str = "keyword=\(search)&num=40&appkey=de394933e1a3e2db"

 //设置请求对象的请求体

req.httpBody = str.data(using: .utf8)

 // (5)会话对象请求服务器数据

 URLSession .shared.dataTask(with: req) { (data, response, error) in

 //停止菊花

 DispatchQueue.main.async {

 UIApplication.shared.isNetworkActivityIndicatorVisible = false

            }

 //如果服务器连接失败

 if error != nil {

 DispatchQueue.main.async {

vc.showAlert(msg: "服务器连接超时", sec: 2.0)

                }

 return

            }

 //Json解析

 let jsonData = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments)


 if jsonData == nil {

 DispatchQueue.main.async {

vc.showAlert(msg: "网络数据错误", sec: 2.0)

                }

 return

            }

 //如果正确,将解析的json数据返回给Controller

 let jsonDic = jsonData as! NSDictionary

 let status = jsonDic.value(forKey: "status") as! NSString

 let msg = jsonDic.value(forKey: "msg") as! String

 if status.intValue != 0 {

 DispatchQueue.main.async {

vc.showAlert(msg: msg, sec: 2.0)

                }

 return

            }


 //得到json数据中result字段对应的字典

 let resultDic = jsonDic.value(forKey: "result") as! NSDictionary

 //获取result字典中list字典

 let listArr = resultDic.value(forKey: "list") as! NSArray

 //Model封装

 var modelArr:[Recipe] = []

 //遍历数组中的每一个字典

 for item in listArr {

 let itemDic = item as! NSDictionary

 let one = Recipe()

one.name = itemDic.value(forKey: "name") as? String

one.id = itemDic.value(forKey: "id") as? String

one.content = itemDic.value(forKey: "content") as? String

modelArr.append(one)

            }


completion(modelArr,true)


}.resume()

    }

}

第二个界面请求的数据显示

class RecipeResultViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {

 var passString:String?  = ""

 var tableData:[Recipe]?

 var table:UITableView?


 //MARK: ------------ UITableViewDataSource -------------


 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {


 if let count = tableData?.count {

 return count

        }

 return 0

    }


 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

 let identifier = "cell"

 var cell = tableView.dequeueReusableCell(withIdentifier: identifier)

 if cell == nil {

cell = UITableViewCell(style: .subtitle, reuseIdentifier: identifier)

        }


 let one = self.tableData![indexPath.row] as? Recipe

cell?.textLabel?.text = one?.name

cell?.detailTextLabel?.text = one?.content


 return cell!

    }



 override func viewDidLoad() {

 super.viewDidLoad()

 // 设置View的背景色

 self.view.backgroundColor = UIColor.groupTableViewBackground


 self.navigationItem.title = "\"\(passString!)的搜索结果\""


 //实例化表格视图

 table = UITableView(frame: CGRect(x: 0, y: 0, width: SCR_W, height: SCR_H), style: .plain)

 table?.delegate = self

 table?.dataSource = self

 table?.rowHeight = 65

 self.view.addSubview(table!)

    }


 override func viewWillAppear(_ animated: Bool) {

 let urlser = URLService()

urlser.getSearchRecipes(search: self.passString!, vc: self) { (data, success) in

 if !success {

 return

            }

 self.tableData = data as? [Recipe]

 DispatchQueue.main.async {

 self.table?.reloadData()

            }

        }

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,248评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,681评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,443评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,475评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,458评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,185评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,451评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,112评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,609评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,083评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,163评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,803评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,357评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,357评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,590评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,636评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,925评论 2 344

推荐阅读更多精彩内容