RXSwift使おうとしたらビルドできなかった!
🤔やってみたいこと
RXSwiftを使用して、APIからデータを取得してデータを表示するのをやってみようとしたのですが、エラーではまりました😨
このAPIを使う
Swiftでは有名なライブラリの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でパッケージを追加する方法を使うと治った???
Swift Package Managerで、RXSwiftのGithubのURLを入力して追加する。
こちらのチュートリアル動画を参考に設定すればデモアプリを作成できました。
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