【iOS14】仿網(wǎng)易云桌面小組件(二)

上一篇文章【iOS14】仿網(wǎng)易云桌面小組件(一)介紹了如果創(chuàng)建小組件,并使用SwiftUI簡(jiǎn)單實(shí)現(xiàn)了網(wǎng)易云小組件的界面,本篇將從網(wǎng)絡(luò)請(qǐng)求翅楼,圖片同步韵吨,動(dòng)態(tài)數(shù)據(jù)展示等方面來(lái)對(duì)小組件進(jìn)行優(yōu)化缎讼。

通過(guò)本篇文章你將學(xué)到以下幾點(diǎn)
1专执、SwiftUI中的網(wǎng)絡(luò)請(qǐng)求肩祥,圖片同步下載
2飞几、動(dòng)態(tài)刷新小組件
3砚哆、小組件中參數(shù)傳遞,綁定數(shù)據(jù)循狰,實(shí)現(xiàn)如下效果


小組件

SwiftUI中的網(wǎng)絡(luò)請(qǐng)求窟社,圖片同步下載

首先我們根據(jù)內(nèi)容先來(lái)定義數(shù)據(jù)模型

struct GKWYData {
    let title: String   // 標(biāo)題
    let desc: String    // 描述
    let icon: String    // 圖標(biāo)名稱
    let bg: String      // 背景圖片名稱
    var bgImage: UIImage? = UIImage(named: "background") // 背景圖片對(duì)象
}

// 創(chuàng)建默認(rèn)數(shù)據(jù)
let defaultData = GKWYData(title: "每日音樂推薦", desc: "為你帶來(lái)每日驚喜", icon: "cm4_disc_type_list", bg: "leida_bg")

我們創(chuàng)建一個(gè)類GKWYDataLoader,然后定義靜態(tài)方法獲取每日音樂推薦绪钥,代碼如下:

struct GKWYDataLoader {
    /// 請(qǐng)求推薦內(nèi)容
    /// - Parameter completion: 請(qǐng)求完成回調(diào)
    static func request(completion: @escaping (GKWYData) -> Void) {
        // 熱門音樂列表接口灿里,成功后用隨機(jī)設(shè)置一個(gè)音樂為推薦音樂
        // 如果獲取不到則使用默認(rèn)數(shù)據(jù),保證不能為空
        let url = URL(string: "https://musicapi.qianqian.com/v1/restserver/ting?format=json&from=ios&channel=appstore&method=baidu.ting.billboard.billList&type=1&size=20&offset=0")!
        let request = URLRequest(url: url)
        
        URLSession.shared.dataTask(with: request) { (data, response, error) in
            if data != nil && error == nil {
                let json = try! JSONSerialization.jsonObject(with: data!, options: []) as! [String: Any]
                let error_code = json["error_code"] as! Int
                if error_code == 22000 {
                    if let list = (json["song_list"] as? [[String: Any]]) {
                        // 獲取隨機(jī)數(shù)
                        let random = arc4random() % UInt32(list.count)
                        let item = list[Int(random)]
                        
                        let title = item["title"] as! String
                        let author = item["author"] as! String
                        let album = item["album_title"] as! String
                        let desc = author + "-" + album
                        let cover = item["pic_radio"] as! String
                        
                        var image: UIImage? = UIImage(named: "background")
                        // 同步網(wǎng)絡(luò)圖片到本地
                        if let data = try? Data(contentsOf: URL(string: cover)!) {
                            image = UIImage(data: data)
                        }
                        
                        let wyData = GKWYData(title: title, desc: desc, icon: "cm4_disc_type_list", bg: "", bgImage: image)
                        completion(wyData)
                    }else {
                        completion(defaultData)
                    }
                }else {
                    completion(defaultData)
                }
            }else {
                completion(defaultData)
            }
        }.resume()
    }
}

2程腹、動(dòng)態(tài)刷新小組件

給SimpleEntry增加數(shù)據(jù)模型

struct SimpleEntry: TimelineEntry {
    let date: Date
    let data: GKWYData
}

修改Provider里面的getTimeline方法如下匣吊,每隔5分鐘刷新一次數(shù)據(jù)

func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        let currentDate = Date()
        let updateDate = Calendar.current.date(byAdding: .minute, value: 5, to: currentDate)
        
        GKWYDataLoader.request { (data) in
            let entry = SimpleEntry(date: currentDate, data: data)
            let timeline = Timeline(entries: [entry], policy: .after(updateDate!))
            completion(timeline)
        }
    }

3、小組件中參數(shù)傳遞寸潦,綁定數(shù)據(jù)

在GKWYWidgetView中增加數(shù)據(jù)模型色鸳,并綁定數(shù)據(jù)

struct GKWYWidgetView: View {
    let data: GKWYData
    
    var body: some View {
        GeometryReader { geo in
            ZStack(alignment: .bottomLeading) {
                // 添加背景圖
                Image(uiImage: data.bgImage!)
                    .resizable()
                // 添加陰影
                LinearGradient(gradient: Gradient(colors: [Color.black.opacity(0.15), Color.black.opacity(0.35)]), startPoint: .top, endPoint: .bottom)
                // 添加logo
                Image("cm2_clock_logo")
                    .resizable()
                    .scaledToFill()
                    .frame(width: 20, height: 20)
                    .position(x: geo.size.width - (20/2) - 10, y: (20/2) + 10)
                    .ignoresSafeArea(.all)
                // 添加左下角的圖標(biāo)及文字
                VStack(alignment: .leading, spacing: 5) {
                    HStack() {
                        Image(data.icon)
                            .resizable()
                            .frame(width: 20, height: 20)
                        Text(data.title)
                            .font(.system(size: 16))
                            .foregroundColor(.white)
                    }
                    
                    Text(data.desc)
                        .font(.system(size: 14))
                        .foregroundColor(.white)
                }.padding()
            }
        }
    }
}

修改GKWYWidgetEntryView并傳遞數(shù)據(jù)

struct GKWYWidget2EntryView : View {
    var entry: Provider.Entry

    var body: some View {
        GKWYWidgetView(data: entry.data)
    }
}

然后運(yùn)行小組件,就可以看到下面的效果


動(dòng)態(tài)小組件

至此见转,小組件中動(dòng)態(tài)顯示網(wǎng)絡(luò)數(shù)據(jù)就已經(jīng)完成命雀。

最后

本篇文章我們學(xué)到了從網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)并在小組件中動(dòng)態(tài)顯示,接下來(lái)將會(huì)介紹給小組件增加可編輯功能
---敬請(qǐng)期待

參考資料

iOS14 Widget小組件開發(fā)實(shí)踐2——自定義Widget
網(wǎng)易云音樂 iOS 14 小組件實(shí)戰(zhàn)手冊(cè)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末斩箫,一起剝皮案震驚了整個(gè)濱河市吏砂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乘客,老刑警劉巖狐血,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異易核,居然都是意外死亡匈织,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門牡直,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)缀匕,“玉大人,你說(shuō)我怎么就攤上這事井氢∠易罚” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵花竞,是天一觀的道長(zhǎng)劲件。 經(jīng)常有香客問我掸哑,道長(zhǎng),這世上最難降的妖魔是什么零远? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任苗分,我火速辦了婚禮,結(jié)果婚禮上牵辣,老公的妹妹穿的比我還像新娘摔癣。我一直安慰自己,他們只是感情好纬向,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布择浊。 她就那樣靜靜地躺著,像睡著了一般逾条。 火紅的嫁衣襯著肌膚如雪琢岩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天师脂,我揣著相機(jī)與錄音担孔,去河邊找鬼。 笑死吃警,一個(gè)胖子當(dāng)著我的面吹牛糕篇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播酌心,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼拌消,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了安券?” 一聲冷哼從身側(cè)響起拼坎,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎完疫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體债蓝,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壳鹤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饰迹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芳誓。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖啊鸭,靈堂內(nèi)的尸體忽然破棺而出锹淌,到底是詐尸還是另有隱情,我是刑警寧澤赠制,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布赂摆,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏烟号。R本人自食惡果不足惜绊谭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汪拥。 院中可真熱鬧达传,春花似錦、人聲如沸迫筑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)脯燃。三九已至搂妻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間曲伊,已是汗流浹背叽讳。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坟募,地道東北人岛蚤。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像懈糯,于是被迫代替她去往敵國(guó)和親涤妒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容