我的第一個全棧模式下的 IOS APP

標題有點繞什么叫 我的第一個全棧模式下的 IOS APP

  • 首先完成后臺API的開發(fā)
  • 然后完成前端的開發(fā)IOS
  • 最后這個APP并沒有什么卵用

不過秆剪,好歹是我開啟全棧模式下的第一次嘗試赊淑,還是很有必要總結一下的。首先仅讽,曬一下最終效果:

APP 的 LOGO:

運行什么的

看出來了吧陶缺,這貨其實就是一個帶倒計時進度條功能的任務管理軟件

數據層

數據層真沒有什么好說的,一個單表何什,表結構如下:

邏輯層

邏輯層說白了就是PHP寫的API组哩,主要就是在數據庫查詢一下數據,然后封裝成API供前端調用即可:

  • 數據庫連接 (自己寫一個單例模式的數據庫連接類就可以了)
    直接上PHP代碼:

  • 數據的查詢和操作方法的路由(暫時比較簡陋)

  • 接口的封裝
    參考我的另一篇文章 用PHP編寫一個APP的API之數據接口封裝

展示層

展示層就是IOS客戶端了,這里主要使用TableView作為容器
首先伶贰,進入程序后會 執(zhí)行調用首頁API蛛砰,獲取數據,然后把數據保存在內存里的一個數組中黍衙。

  • 從網絡獲取數據:
    設置URL泥畅,設置session,發(fā)送請求在閉包內進行數據解析(JSON數據)

  • 展示數據:
    自定義一個tableviewCell的類作為每一個cell的模板琅翻,然后為tableView設置delegate和datasource就可以了位仁。
    關于數據的展示這里不詳細說明也說不清除,有時候我自己都覺得自己寫的代碼有些奇葩方椎。給一個傳送門:
    A Beginner’s Guide to Presentation Controllers in iOS 8
    比較詳細的介紹了swift開發(fā)中入門級但是又實用的知識聂抢。

  • 修改 和 刪除 數據的API類

重復代碼較多,很丑陋棠众,請勿模仿

import Foundation
let url = NSURL(string: "http://101.200.74.199/todo/v1/index.php")
let request = NSMutableURLRequest(URL: url!)

class TodoAPI {
    func postThing(thing:Thing) -> Bool{
        print("post ..............................")
        request.HTTPMethod = "POST"
        let postString = "m=save&name=\(thing.name)&desc=\(thing.desc)&start_time=\(thing.startTime)&end_time=\(thing.endTime)&statu=\(thing.statu)"
        request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
        
        var result = false
        
        let task =  NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in
            if error != nil{
                print(error)
            }
            print(data)
            print(response)
            do{
                let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary
                print(json)
                result = (json!["data"] as! Int) == 1 ? true : false
            }catch{
                print("應用程序在解析JSON數據時拋出異常")
            }
        }
        task.resume()
        return result
    }
    
    func delThing(id:Int) -> Bool{
        print("post ..............................")
        request.HTTPMethod = "POST"
        let postString = "m=del&id=\(id)"
        request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
        
        var result = false
        
        let task =  NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in
            if error != nil{
                print(error)
            }
            print(data)
            print(response)
            do{
                let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary
                print(json)
                result = (json!["data"] as! Int) == 1 ? true : false
            }catch{
                print("應用程序在解析JSON數據時拋出異常")
            }
        }
        task.resume()
        return result
    }
    
    func updateThing(thing:Thing) -> Bool{
        print("post ..............................")
        request.HTTPMethod = "POST"
        let postString = "m=update&id=\(thing.id)&name=\(thing.name)&desc=\(thing.desc)&start_time=\(thing.startTime)&end_time=\(thing.endTime)"
        request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
        var result = false
        let task =  NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) -> Void in
            if error != nil{
                print(error)
            }
            print(data)
            print(response)
            do{
                let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary
                print(json)
                result = (json!["data"] as! Int) == 1 ? true : false
            }catch{
                print("應用程序在解析JSON數據時拋出異常")
            }
        }
        task.resume()
        return result
    }
}

最后琳疏,還有一個時間處理的工具,不解釋闸拿,直接上代碼:

//
//  DateTimeUtil.swift
//  ToDo
//
//  Created by scoot on 15/10/4.
//  Copyright ? 2015年 安明哲. All rights reserved.
//

import Foundation

class DateTimeUtil{
    
    
    let dateFormatetr = NSDateFormatter()
    
    func setDateFormatter(){
        self.dateFormatetr.dateFormat = "yyyy-MM-dd HH:mm:ss"
    }
    
    func formatDateToString(dateTime:NSDate) -> String{
        setDateFormatter()
        return dateFormatetr.stringFromDate(dateTime)
    }
    
    func formatStringToDate(dateTimeStr: String) -> NSDate{
        setDateFormatter()
        return dateFormatetr.dateFromString(dateTimeStr)!
    }
    
    func getWorkRate(startTime: String, endTime: String) -> Float{
        let start = formatStringToDate(startTime).timeIntervalSince1970
        let end = formatStringToDate(endTime).timeIntervalSince1970
        let now = NSDate().timeIntervalSince1970
        var rate = (now - start) / (end - start)
        rate = floor(rate*1000)/1000
        return Float(rate)
    }
    
    //粗方法代碼很是土鱉
    func timeToNature(endTime: String) -> String{
        let end = formatStringToDate(endTime).timeIntervalSince1970
        let now = NSDate().timeIntervalSince1970
        let timestamp = end - now
        if timestamp < 0{
            return "已經完結"
        }
        let nature = timestamp / 3600
        if nature > 24{
            return ("\(Int(nature/24))天后完結")
        }else if nature > 1{
            return("\(Int(nature))小時后完結")
        }else if nature < 1 {
            if nature*3600 < 60{
                return ("\(Int(nature*60*60))秒后完結")
            }
            return("\(Int(nature*60))分鐘后完結")
        }
           
        else{
            return ""
        }
    }
    
    //這里可以用enumeration的
    func timeToStatu(endTime: NSDate) -> Int{
        switch endTime.compare(NSDate()){
        case NSComparisonResult.OrderedAscending:
            return 2  //已經完成
        case NSComparisonResult.OrderedDescending:
            return 1 //正在做
        default:
            return 0 //還沒有開始
        }
    }
    
    
}

基本上就是這樣咯空盼!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市新荤,隨后出現(xiàn)的幾起案子揽趾,更是在濱河造成了極大的恐慌,老刑警劉巖苛骨,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篱瞎,死亡現(xiàn)場離奇詭異,居然都是意外死亡智袭,警方通過查閱死者的電腦和手機奔缠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吼野,“玉大人校哎,你說我怎么就攤上這事⊥剑” “怎么了闷哆?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長单起。 經常有香客問我抱怔,道長,這世上最難降的妖魔是什么嘀倒? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任屈留,我火速辦了婚禮局冰,結果婚禮上,老公的妹妹穿的比我還像新娘灌危。我一直安慰自己康二,他們只是感情好,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布勇蝙。 她就那樣靜靜地躺著沫勿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪味混。 梳的紋絲不亂的頭發(fā)上产雹,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音翁锡,去河邊找鬼蔓挖。 笑死,一個胖子當著我的面吹牛盗誊,可吹牛的內容都是我干的时甚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼哈踱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梨熙?” 一聲冷哼從身側響起开镣,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咽扇,沒想到半個月后邪财,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡宛瞄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年凡伊,在試婚紗的時候發(fā)現(xiàn)自己被綠了年碘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡怎憋,死狀恐怖,靈堂內的尸體忽然破棺而出九昧,到底是詐尸還是另有隱情绊袋,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布铸鹰,位于F島的核電站癌别,受9級特大地震影響,放射性物質發(fā)生泄漏蹋笼。R本人自食惡果不足惜展姐,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一躁垛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧圾笨,春花似錦缤苫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谍婉,卻和暖如春舒憾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背穗熬。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工镀迂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唤蔗。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓探遵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妓柜。 傳聞我的和親對象是個殘疾皇子箱季,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容