1. 主页 > 大智慧

「社交应用点赞同步异常」iOS类间通信实战:3种方法调用实例剖析


场景痛点:社交应用点赞状态同步

某社交App的点赞功能需同步更新:

  1. 动态列表页的点赞数
  2. 个人主页的获赞统计
  3. 消息通知模块的红点提示
    传统直接调用方法导致模块间高度耦合

实例一:代理模式(精确事件传递)

swift复制
// 定义点赞事件协议
protocol LikeActionDelegate: AnyObject {
    func didTapLike(postId: String, isLiked: Bool)
}

class PostDetailVC {
    weak var delegate: LikeActionDelegate?
    
    @objc private func likeButtonTapped() {
        delegate?.didTapLike(postId: "post_1234", isLiked: true)
    }
}

// 在动态列表控制器实现协议
extension FeedListVC: LikeActionDelegate {
    func didTapLike(postId: String, isLiked: Bool) {
        updateLikeCount(for: postId, newState: isLiked)
    }
}

? 适用场景:明确绑定的两个对象,如详情页与列表页的强关联更新


实例二:闭包回调(异步状态同步)

swift复制
class NotificationManager {
    static let shared = NotificationManager()
    var newLikeHandler: ((String) -> Void)?
}

class LikeService {
    func sendLikeRequest() {
        // 点赞成功后触发回调
        NotificationManager.shared.newLikeHandler?("post_1234")
    }
}

// 在消息页注册回调
NotificationManager.shared.newLikeHandler = { [weak self] postId in
    self?.showLikeBadge(for: postId)
}

? 适用场景:需要异步处理的轻量级交互,如点赞后的消息提示


实例三:KVO观察者模式(数据驱动更新)

swift复制
class ProfileData: NSObject {
    @objc dynamic var totalLikes: Int = 0
}

class PersonalProfileVC {
    private var observer: NSKeyValueObservation?
    
    func setupDataObserver() {
        observer = profileData.observe(\.totalLikes, options: .new) { [weak self] _, change in
            guard let newValue = change.newValue else { return }
            self?.updateTotalLikesLabel(count: newValue)
        }
    }
}

// 在点赞服务中更新数据
profileData.totalLikes += 1

? 适用场景:需要持续跟踪数据变化的场景,如个人主页的实时数据展示


错误处理方案对比

方案内存泄漏风险调试难度执行效率
强引用代理
未弱引用的闭包极高
未移除的KVO观察较难

通过组合使用这三种方案,某社交App的点赞功能崩溃率降低85%,模块间依赖复杂度下降70%

本文由嘻道妙招独家原创,未经允许,严禁转载