😇

RXSwift使おうとしたらビルドできなかった!

2024/04/24に公開

🤔やってみたいこと

RXSwiftを使用して、APIからデータを取得してデータを表示するのをやってみようとしたのですが、エラーではまりました😨

このAPIを使う
https://jsonplaceholder.typicode.com/posts

Swiftでは有名なライブラリのRXSwiftを使います
https://github.com/ReactiveX/RxSwift

pod initして自動生成されたPodfileを使おうとしたがビルドしたらエラーが出た?

Podfile:

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'RXSwiftTutorial' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for RXSwiftTutorial
  pod 'RxSwift', '6.7.0'
  pod 'RxCocoa', '6.7.0'
end

コード書いてビルドしたらこんなエラーが出てきた!

Sandbox: rsync.samba(12743) deny(1) file-write-create /Users/jboy422/Library/Developer/Xcode/DerivedData/RXSwiftTutorial-gkfdszugejcbzlaniaiyjikgfgxx/Build/Products/Debug-iphonesimulator/RXSwiftTutorial.app/Frameworks/RxCocoa.framework/_CodeSignature

パーミッションの権限の問題かもしれないとコマンドを使ってみた

sudo chown -R $(whoami) ~/Library/Developer/Xcode/DerivedData/

プロジェクトをクリーンアップしても治らなかった😱

🚀やってみたこと

GUIでパッケージを追加する方法を使うと治った???
https://zenn.dev/ryodeveloper/articles/kame_ga_7_hiki

Swift Package Managerで、RXSwiftのGithubのURLを入力して追加する。

https://github.com/ReactiveX/RxSwift

こちらのチュートリアル動画を参考に設定すればデモアプリを作成できました。
https://www.youtube.com/watch?v=dnmQ3X8o6Fs

ViewControllerを修正

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController, UIScrollViewDelegate {
    
    private var viewModel = ViewModel()
    private var bag = DisposeBag()
    lazy var tableView : UITableView = {
        let tv = UITableView(frame: self.view.frame, style: .insetGrouped)
        tv.translatesAutoresizingMaskIntoConstraints  = false
        tv.register(UserTableViewCell.self, forCellReuseIdentifier: "UserTableViewCell")
        return tv
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(tableView)
        viewModel.fetchUsers()
        bindTableView()
    }
    
    func bindTableView() {
        tableView.rx.setDelegate(self).disposed(by: bag)
        viewModel.users.bind(to: tableView.rx.items(cellIdentifier: "UserTableViewCell", cellType: UserTableViewCell.self)) { (row, item, cell) in
            cell.textLabel?.text = item.title
            cell.detailTextLabel?.text = "\(item.id)"
        }.disposed(by: bag)
    }
}

extension ViewController : UITableViewDelegate {}

class ViewModel {
    var users = BehaviorSubject(value: [User]())
    
    func fetchUsers() {
        let url = URL(string: "https://jsonplaceholder.typicode.com/posts")
        let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
            guard let data = data else {
                return
            }
            do {
                let responseData = try JSONDecoder().decode([User].self, from: data)
                self.users.on(.next(responseData))
            } catch {
                print(error.localizedDescription)
            }
            
        }
        task.resume()
    }
}

struct User: Codable {
    let userID, id: Int
    let title, body: String
    
    enum CodingKeys: String, CodingKey {
        case userID = "userId"
        case id, title, body
    }
}

CocoaTouchで、 UITableViewCellを作成する。UserTableViewCellをしてすると、StoryBoardの設定を削除しなくてもコード書いて、UIKitで画面を作成することができます。

import UIKit

class UserTableViewCell: UITableViewCell {
    
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: .value1, reuseIdentifier: "UserTableViewCell")
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

後はビルドするだけで、APIから取得したデータを表示することができました。

🙂最後に

今回は、RXSwift + UIKitを使って、APIからデータを取得して表示するのをやってみました。動画の通りにやってもできないのでエラーで詰まりましたが、パッケージをCocoaPodsからSwift Packge Managerで追加するのに変更したら、エラーを解消できました。
どうなっているのだろうか....

こちらが完成品です

Discussion