狠狠撸

狠狠撸Share a Scribd company logo
スタートアップでiOSアプリの
UIリプレイスした話
自己紹介
● 遠藤拓弥
● 職歴
○ 元SIer 6年くらい
■ Java/PHPメイン NW/サーバ構築してたことも
○ 株式会社 LifeSports 2018/3 -
■ iOSエンジニア/Androidエンジニア
● 趣味
○ サッカー/フットサル好き (毎週末の海外サッカー観戦
が楽しみ)
スポーツやりたい人同士をマッチ
ングするアプリ
iosは9/19
リニューアルリリース
androidは10/14
リニューアルリリース
LifeSportsのUIリニューアル
iOSアプリのUIリプレイスの問題
● API仕様書が無い...
● ソースコード見なきゃわからない動作あり
○ (て言うかそれがほとんど)
○ 細かく作り込みずぎ
?
?
何をやったか?
● iOSアプリのUIリプレイス中に...
○ Apikit ?? Decodable へ补辫颈周りを変えた话
○ 贵补迟な惫颈别飞颁辞苍迟谤辞濒濒别谤と戦った话
○ 思い描いた鲍滨が作れなくて苦戦した话
Apikit ?? Decodable へ补辫颈周りを変えた话
Apikit ?? Decodable へapi周りを変えた
● Alamofire × ObjectMapper
● Apikit × Decodable
Apikit ?? Decodable へapi周りを変えた
● Alamofire × ObjectMapper
??自由でなんでもできる
?どんなAPI定義か分からな
い
?メインスレッドで起動する
● Apikit × Decodable
??request/response
定義が一目でわかる
?定義した通りにAPI帰って
来ないとエラー
Apikit ?? Decodable へapi周りを変えた
class func recommendList(_ filterString: String, pageIndex: String, lat: Double?, lng: Double?) {
var para = Json()
let sportIds = Sport.allFavorited()
if let cityID = City.getCityId() {
para.update(["city_id": cityID])
} else {
if let city = User.me()?.city {
para.update(["city_id": city.id]
}
}
if let lat = lat, let lng = lng {
para.update(["lat": lat, "lng": lng])
}
● リクエストの直前にリクエストの内容変えたりできる
Apikit ?? Decodable へapi周りを変えた
struct EventRecommendGetRequest: APIRequest {
let type: EventRecommendType // リクエストに必要な情報たち
let cityId: Int
let sportIds: [Int]
let page: Int
let lat: Double?
let lng: Double?
let apiToken: String?
typealias Response = EventRecommendGetResponse
let method: APIKit.HTTPMethod = .get
var path: String {
return "/v2/me/event/recommend"}
}
var queryParameters: [String : Any] = ["city_id": cityId,"type": type.value,"page": page]
}
● リクエストとレスポンスをしっかり定義できる
Apikit ?? Decodable へapi周りを変えた
struct EventEntity: Decodable {
let title:String <-必須項目 if let いらないから使いやすい
let user:UserEntity //募集者
/// 参加者 募集者も入ってる
let users:[UserEntity]
let id:Int
// 施設
let facility:FacilityEntity?
// 位置情報
let meetingPlaceLat:Double? <-任意項目 null判定必要
let meetingPlaceLng:Double?
}
● リクエストとレスポンスをしっかり定義できる
贵补迟な惫颈别飞颁辞苍迟谤辞濒濒别谤と戦った话
??1000行近くの肠辞诲别??
贵补迟な惫颈别飞颁辞苍迟谤辞濒濒别谤と戦った话
FatなviewControllerとは?
? 処理が追いにくい。読みにくい
? どう呼び出せるViewControllerなのか中身見ないと分から
ない
? 痴颈别飞颁辞苍迟谤辞濒濒别谤が背负う责务が大きすぎる
贵补迟な惫颈别飞颁辞苍迟谤辞濒濒别谤と戦った话
やったこと
? 処理が追いにくい。読みにくい
->xibファイルを使って細かくViewを分けた?
->共通処理などはextentionへ
? どう呼び出せるViewControllerなのか中身見ないと分から
ない
->viewControllerのinit処理書いた?
? 痴颈别飞颁辞苍迟谤辞濒濒别谤が背负う责务が大きすぎる
->正直あまり解決できていない...?
xibファイルを使って細かくViewを分けた?
● UI的な動作はそれぞれの
Viewに委任
● データの取り回しは上位の
ViewControllerが実施
共通処理などはextentionへ?
extentionで呼び出せばok
UITextField使ってればいつでも
呼び出せる
viewControllerのinit処理書いた
初期化処理ちゃんと書いてない... ?
viewControllerのinit処理書いた
初期化処理ちゃんと書いてない... ?
viewControllerの変数に代入するとか言う...
viewControllerのinit処理書いた
呼び出しやすい?
贵补迟な惫颈别飞颁辞苍迟谤辞濒濒别谤と戦った话 まとめ
FatなviewControllerとは?
? 処理が追いにくい。読みにくい
? どう呼び出せるViewControllerなのか中身見ないと分から
ない
? 痴颈别飞颁辞苍迟谤辞濒濒别谤が背负う责务が大きすぎる
思い描いた鲍滨が作れなくて苦戦した话
募集詳細編
● 募集者が作成した募集の開催
日や参加者などが見える画面
募集詳細編
UIリプレイス前の僕
「上からview置いてって作ってけ
ばできるでしょ」
募集詳細編
UIリプレイス前の僕
「上からview置いてって作ってけ
ばできるでしょ」
ベースとなるViewをどのように
するか決めるべきだった..
募集詳細編
TableViewCell
tableviewFooterView
tableviewHeaderView
TableViewをベースに作成
Top編
● ログインした時に最初に見え
る画面
● スマートニュース風のUI
Top編
UIリプレイス前の僕
「scrollview × collentionView ×
tableviewController
の組み合わせで行けそう」
Top編
セクションを選択した時の動作
やスライド/スワイプ時の
細かい挙動を一から作るのは現
実的では無い..
UIリプレイス前の僕
「scrollview × collentionView ×
tableviewController
の組み合わせで行けそう」
Top編
ライブラリを使用
https://github.com/kitasuke/
PagingMenuController
(今開発されてないけど)
tableviewFooterViewTableViewCell
tableviewHeaderView
PagingMenu
Controller
思い描いた鲍滨が作れなくて苦戦した话 - まとめ
● 繰り返しの項目がある場合、Tableviewをベースにそれ以外の部分を
TableHeaderView/TableFooterViewで囲うことでおおよそのUIは実現可能
● 複雑なUI/UXを実現したい場合は、ライブラリを使ったほうがいいことも。
○ むやみに使うべきでは無い。
○ そのUIの重要度によってはある程度自作?
○ 普段から得意なUI作ったほうがいいかも?
今後やりたいこと
● MVVMやRxなどの設計で開発して見たい
○ 楽に開発できるならなんでもいいが..
○ 今度業務委託で入った人にやってもらう予定
● UIしんどい
○ デザインが正になるとキツイ
○ 自分の得意なUIをいくつか持っとくべき?
● 自分の判断が正しいか分からない
○ 他のiOSエンジニアにも意見聞けるようにしてきたい!

More Related Content

スタートアップで颈翱厂アプリの鲍滨リプレイスした话