關(guān)于RxSwift通知中心NotificationCenter的一個(gè)bug

問(wèn)題描述

  1. 列表中的任務(wù),是要用戶分享到微信群或者朋友圈,當(dāng)分享成功收到回調(diào)之后,把改任務(wù)設(shè)置成"已完成"
  2. 連續(xù)若干次分享,前面n次都沒(méi)有分享成功,第n+1次分享成功后,前面的所有任務(wù)都變成了"已完成"

問(wèn)題排查

在相關(guān)頁(yè)面中,有個(gè)shareToWechat的方法

當(dāng)用戶點(diǎn)擊了"分享"按鈕,就調(diào)用這個(gè)方法,方法中添加了一個(gè)微信分享回調(diào)通知監(jiān)聽(tīng)

監(jiān)聽(tīng)回調(diào)方法中,把該任務(wù)id加入到已完成列表,代碼如下:

// 分享到微信
    private func shareToWechat(model: GWXShareModel, task: GOwnMissionMetaTask){
        // 調(diào)用分享
        if wxShareSendMultiMessage(model: model) == false {
            SVProgressHUD.showError(withStatus: "分享失敗")
            return
        }
        SVProgressHUD.dismiss()
        NotificationCenter.default.rx
            .notification(Notification.Name.init(R.string.global.kNoti_Share_Wechat_Success()))
            .subscribe({ (noti) in
            print("~~~~分享成功!!")
            SVProgressHUD.dismiss()
            // 把當(dāng)前任務(wù)加到完成列表里,用戶可以領(lǐng)取獎(jiǎng)勵(lì)
            self.viewModel.addTaskToDoneList(id: task.id)
            // 刷新列表
            self.viewModel.missionList.value = self.viewModel.missionList.value
            
        }).disposed(by: self.disposeBag)
    }

問(wèn)題分析

  • 通過(guò)斷點(diǎn)調(diào)試,發(fā)現(xiàn)當(dāng)?shù)趎+1次分享成功后,發(fā)射了一次成功回調(diào)的廣播

  • 成功的回調(diào)被注冊(cè)了n+1次,于是回調(diào)方法調(diào)用了n+1次,問(wèn)題就出在了這里.

  • 所以 問(wèn)題的關(guān)鍵是: 如何保證沒(méi)有分享成功的任務(wù),不執(zhí)行成功的回調(diào)方法

問(wèn)題解決

為了達(dá)到目的,我目前有兩個(gè)想法:

  1. 在分享成功的廣播發(fā)送后,分別進(jìn)入到n+1個(gè)回調(diào)操作,然后通過(guò)某種條件判斷當(dāng)前的任務(wù)是否成功
  2. 在分享失敗的廣播發(fā)送后,把對(duì)任務(wù)成功的訂閱事件銷毀掉

經(jīng)過(guò)一番思索,發(fā)現(xiàn)想法1不可行,想法2很容易做到,最終的代碼如下:

    // 分享到微信
    private func shareWX(model: GWXShareModel, task: GOwnMissionMetaTask){
        // 調(diào)用分享
        if wxShareSendMultiMessage(model: model) == false {
            SVProgressHUD.showError(withStatus: "分享失敗")
            return
        }
        // 分享成功的監(jiān)聽(tīng)
        let notificationSubscription = NotificationCenter.default.rx
            .notification(Notification.Name.init(R.string.global.kNoti_Share_Wechat_Success()))
            .subscribe({ (noti) in
            print("~~~~分享成功!!")
            SVProgressHUD.dismiss()
            // 把當(dāng)前任務(wù)加到完成列表里,用戶可以領(lǐng)取獎(jiǎng)勵(lì)
            self.viewModel.addTaskToDoneList(id: task.id)
            // 刷新列表
            self.viewModel.missionList.value = self.viewModel.missionList.value
        })
        // 分享失敗的監(jiān)聽(tīng)
        NotificationCenter.default.rx
        .notification(Notification.Name.init(R.string.global.kNoti_Share_Wechat_Fail()))
            .subscribe { (noti) in
                // 微信分享失敗后,把對(duì)分享成功的rx監(jiān)聽(tīng)對(duì)象銷毀
                notificationSubscription.dispose()
        }.disposed(by: disposeBag)
    }

總結(jié)

對(duì)于監(jiān)聽(tīng)通知,要留意是否注冊(cè)了多余的訂閱者,如果不及時(shí)清除很可能會(huì)有bug

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,241評(píng)論 8 265
  • 值此平安夜、圣誕、元旦來(lái)臨之際,現(xiàn)邀請(qǐng)各位親朋好友前來(lái)浦東相聚,借此以分享我再次喜得千金之快樂(lè)! 另附愛(ài)女照...
    萌豆寶閱讀 421評(píng)論 0 0
  • 子曰:父在觀其志,父沒(méi)觀其行。三年無(wú)改于父之道,可謂孝矣。 感悟:錢穆老先生說(shuō),論語(yǔ)文辭簡(jiǎn)約,異解逐滋。的確如此!...
    名言名語(yǔ)March閱讀 137評(píng)論 0 0
  • 稻盛和夫指出,作為領(lǐng)導(dǎo)者,應(yīng)該保持積極的心態(tài),其中包括付出超過(guò)常人的努力,取得下屬的認(rèn)同感等。 “領(lǐng)導(dǎo)者是一個(gè)部門...
    金尚沄閱讀 12,107評(píng)論 0 0
  • 輕風(fēng)細(xì)雨乍曉寒。草枯葉落,已覺(jué)秋心難。問(wèn)聲雁兒為何單?半杯殘酒癡相纏。 輕解羅衫揮袖舞。斜靠柳肩,枕風(fēng)...
    愛(ài)那么多閱讀 355評(píng)論 0 3

友情鏈接更多精彩內(nèi)容