swift 网络搜索热词排行

2024-04-26 09:08

本文主要是介绍swift 网络搜索热词排行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.使用www.showapi.com上的接口,需要注册添加一个App,这样才能获取appid和secret密钥,调用前需要订购套餐(选免费的就可以了);
2.外部库Podfile文件内容,SnapKit这里暂时不需要用到:

platform :ios, '8.0'
use_frameworks!target 'WxArticle' dopod 'Alamofire', '~> 3.0'pod 'SwiftyJSON', :git => 'https://github.com/SwiftyJSON/SwiftyJSON.git'pod 'SnapKit', '~> 0.17.0'
end

3.桥接头文件参考:http://blog.csdn.net/tujiaw/article/details/47048343
4.App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.参考:http://blog.csdn.net/tujiaw/article/details/49975761
5.请求url编码,request.swift

//
//  request.swift
//  HotSearch
//
//  Created by tutujiaw on 16/3/26.
//  Copyright © 2016年 tujiaw. All rights reserved.
//import Foundationclass Request {var appId: Intvar timestamp: String {return NSDate.currentDate("yyyyMMddHHmmss")}var signMethod = "md5"var resGzip = 0var allParams = [(String, String)]()init(appId: Int) {self.appId = appId}func sign(appParams: [(String, String)], secret: String) -> String {self.allParams = appParamsself.allParams.append(("showapi_appid", String(self.appId)))self.allParams.append(("showapi_timestamp", self.timestamp))let sortedParams = allParams.sort{$0.0 < $1.0}var str = ""for item in sortedParams {str += (item.0 + item.1)}str += secret.lowercaseStringreturn str.md5()}func url(mainUrl: String, sign: String) -> String {var url = mainUrl + "?"for param in self.allParams {url += "\(param.0)=\(param.1)&"}url += "showapi_sign=\(sign)"return url}
}class HotWordCategoryRequest: Request {init () {super.init(appId: 17262)}func url() -> String {let sign = self.sign([(String, String)](), secret: "21b693f98bd64e71a9bdbb5f7c76659c")return super.url("http://route.showapi.com/313-1", sign: sign)}
}class HotWordRequest: Request {var typeId = 1init(typeId: Int) {super.init(appId: 17262)self.typeId = typeId}func url() -> String {let sign = self.sign([("typeId", "\(self.typeId)")], secret: "21b693f98bd64e71a9bdbb5f7c76659c")return super.url("http://route.showapi.com/313-2", sign: sign)}
}

6.应答json解码,response.swift

//
//  response.swift
//  HotSearch
//
//  Created by tutujiaw on 16/3/26.
//  Copyright © 2016年 tujiaw. All rights reserved.
//import Foundation
import SwiftyJSONclass Response {var showapi_res_code = -1var showapi_res_error = ""
}struct CategoryChildItem {var id = 0var name = ""
}struct CategoryItem {var name = ""var childList = [CategoryChildItem]()
}class HotWordCategoryResponse: Response {var list = [CategoryItem]()func setData(data: AnyObject) {let json = JSON(data)super.showapi_res_code = json["showapi_res_code"].int ?? -1super.showapi_res_error = json["showapi_res_error"].string ?? ""if let list = json["showapi_res_body"]["list"].array {for item in list {var categoryItem = CategoryItem()guard let name = item["name"].string,let childList = item["childList"].array else {continue}categoryItem.name = namefor child in childList {guard let id = child["id"].string,let name = child["name"].string else {continue}categoryItem.childList.append(CategoryChildItem(id: Int(id)!, name: name))}self.list.append(categoryItem)}}}
}struct HotWordInfo {var level = -1var name = ""var num = -1var trend = ""
}class HotWordResponse: Response {var list = [HotWordInfo]()func setData(data: AnyObject) {let json = JSON(data)super.showapi_res_code = json["showapi_res_code"].int ?? -1super.showapi_res_error = json["showapi_res_error"].string ?? ""if let list = json["showapi_res_body"]["list"].array {for item in list {guard let name = item["name"].string else {continue}var hotWordInfo = HotWordInfo()hotWordInfo.level = Int(item["level"].string ?? "-1") ?? -1hotWordInfo.name = namehotWordInfo.num = Int(item["num"].string ?? "-1") ?? -1hotWordInfo.trend = item["trend"].string ?? ""self.list.append(hotWordInfo)}}}func clear() {self.list.removeAll()}
}

7.数据管理,缓存,dataManage.swift

//
//  dataManage.swift
//  HotSearch
//
//  Created by tutujiaw on 16/3/26.
//  Copyright © 2016年 tujiaw. All rights reserved.
//import Foundationclass Data {static let sharedManage = Data()var hotWordCategory = HotWordCategoryResponse()var hotWord = HotWordResponse()
}

8.Objective-CBridgingHeader.h

//
//  Objective-CBridgingHeader.h
//  HotSearch
//
//  Created by tutujiaw on 16/3/26.
//  Copyright © 2016年 tujiaw. All rights reserved.
//#ifndef QueryPhoneNumber_Objective_CBridgingHeader_h#define QueryPhoneNumber_Objective_CBridgingHeader_h#import <CommonCrypto/CommonHMAC.h>#endif

9.扩展String,计算md5,扩展日期格式化,extension.swift

//
//  extension.swift
//  HotSearch
//
//  Created by tutujiaw on 16/3/26.
//  Copyright © 2016年 tujiaw. All rights reserved.
//import Foundationextension String {func md5() -> String! {let str = self.cStringUsingEncoding(NSUTF8StringEncoding)let strLen = CUnsignedInt(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))let digestLen = Int(CC_MD5_DIGEST_LENGTH)let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen)CC_MD5(str!, strLen, result)let hash = NSMutableString()for i in 0..<digestLen {hash.appendFormat("%02x", result[i])}result.destroy()return String(format: hash as String)}
}extension NSDate {static func currentDate(dateFormat: String) -> String {let dateFormatter = NSDateFormatter()dateFormatter.dateFormat = dateFormatdateFormatter.locale = NSLocale.currentLocale()return dateFormatter.stringFromDate(NSDate())}
}

10.ViewController.swift

//
//  ViewController.swift
//  HotSearch
//
//  Created by tutujiaw on 16/3/25.
//  Copyright © 2016年 tujiaw. All rights reserved.
//import UIKit
import Alamofireclass ViewController: UITableViewController {override func viewDidLoad() {super.viewDidLoad()// Do any additional setup after loading the view, typically from a nib.self.navigationItem.title = "热搜分类"let request = HotWordCategoryRequest()Alamofire.request(.GET, request.url()).responseJSON { (response) -> Void inif response.result.isSuccess {if let value = response.result.value {Data.sharedManage.hotWordCategory.setData(value)self.tableView.reloadData()}}}}override func didReceiveMemoryWarning() {super.didReceiveMemoryWarning()// Dispose of any resources that can be recreated.}override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {if section < Data.sharedManage.hotWordCategory.list.count {let item = Data.sharedManage.hotWordCategory.list[section]print("child list count:\(item.childList.count)")//return Data.sharedManage.hotWordCategory.list[section].childList.count}return 0}override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {let CELL_ID = "HOT_WORD_CATEGORY_CELL_ID"let cell = tableView.dequeueReusableCellWithIdentifier(CELL_ID, forIndexPath: indexPath)if indexPath.section < Data.sharedManage.hotWordCategory.list.count {var item = Data.sharedManage.hotWordCategory.list[indexPath.section]if indexPath.row < item.childList.count {cell.textLabel?.text = item.childList[indexPath.row].name}}return cell}override func numberOfSectionsInTableView(tableView: UITableView) -> Int {return Data.sharedManage.hotWordCategory.list.count}override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {if section < Data.sharedManage.hotWordCategory.list.count {return Data.sharedManage.hotWordCategory.list[section].name}return ""}override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {print("index:\(indexPath.row)")if indexPath.section < Data.sharedManage.hotWordCategory.list.count {let item = Data.sharedManage.hotWordCategory.list[indexPath.section]if indexPath.row < item.childList.count {print("\(item.childList[indexPath.row].name), \(item.childList[indexPath.row].id)")}}}override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {if segue.identifier == "HOT_WORD_SEGUE" {let target = segue.destinationViewController as? HotWordTableViewControllerlet indexPath = tableView.indexPathForSelectedRowif indexPath?.section < Data.sharedManage.hotWordCategory.list.count {let item = Data.sharedManage.hotWordCategory.list[(indexPath?.section)!]if indexPath?.row < item.childList.count {target?.name = item.childList[(indexPath?.row)!].nametarget?.typeId = item.childList[(indexPath?.row)!].id}}}}}

11.HotWordTableViewController.swift

//
//  HotWordTableViewController.swift
//  HotSearch
//
//  Created by tutujiaw on 16/3/26.
//  Copyright © 2016年 tujiaw. All rights reserved.
//import UIKit
import Alamofireclass HotWordTableViewController: UITableViewController {var name = ""var typeId = 0override func viewDidLoad() {super.viewDidLoad()// Do any additional setup after loading the view, typically from a nib.self.navigationItem.title = namelet request = HotWordRequest(typeId: self.typeId)Alamofire.request(.GET, request.url()).responseJSON { (response) -> Void inif response.result.isSuccess {if let value = response.result.value {Data.sharedManage.hotWord.clear()Data.sharedManage.hotWord.setData(value)self.tableView.reloadData()}}}}override func didReceiveMemoryWarning() {super.didReceiveMemoryWarning()// Dispose of any resources that can be recreated.}override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {return Data.sharedManage.hotWord.list.count}override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {let CELL_ID = "HOT_WORD_CELL_ID"let cell = tableView.dequeueReusableCellWithIdentifier(CELL_ID, forIndexPath: indexPath)if indexPath.row < Data.sharedManage.hotWord.list.count {let item = Data.sharedManage.hotWord.list[indexPath.row]cell.textLabel?.text = item.name}return cell}override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {if indexPath.row < Data.sharedManage.hotWord.list.count {let keyword = Data.sharedManage.hotWord.list[indexPath.row].nameif let newKeyword = keyword.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet()) {if let url = NSURL(string: "https://www.baidu.com/s?wd=\(newKeyword)") {UIApplication.sharedApplication().openURL(url)}}}}
}

点击热搜词可以直接打开浏览器在百度里面进行搜索。

github地址:https://github.com/tujiaw/HotSearch
截图:
这里写图片描述
这里写图片描述

这篇关于swift 网络搜索热词排行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/937164

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

hdu 4517 floyd+记忆化搜索

题意: 有n(100)个景点,m(1000)条路,时间限制为t(300),起点s,终点e。 访问每个景点需要时间cost_i,每个景点的访问价值为value_i。 点与点之间行走需要花费的时间为g[ i ] [ j ] 。注意点间可能有多条边。 走到一个点时可以选择访问或者不访问,并且当前点的访问价值应该严格大于前一个访问的点。 现在求,从起点出发,到达终点,在时间限制内,能得到的最大

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

hdu4277搜索

给你n个有长度的线段,问如果用上所有的线段来拼1个三角形,最多能拼出多少种不同的? import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;