標題有點繞什么叫 我的第一個全棧模式下的 IOS APP?
- 首先完成后臺API的開發(fā)
- 然后完成前端的開發(fā)IOS
- 最后這個APP并沒有什么卵用
不過秆剪,好歹是我開啟全棧模式下的第一次嘗試赊淑,還是很有必要總結一下的。首先仅讽,曬一下最終效果:
看出來了吧陶缺,這貨其實就是一個帶倒計時進度條功能的任務管理軟件
數據層
邏輯層
邏輯層說白了就是PHP寫的API组哩,主要就是在數據庫查詢一下數據,然后封裝成API供前端調用即可:
接口的封裝
參考我的另一篇文章 用PHP編寫一個APP的API之數據接口封裝
展示層
展示層就是IOS客戶端了,這里主要使用TableView作為容器
首先伶贰,進入程序后會 執(zhí)行調用首頁API蛛砰,獲取數據,然后把數據保存在內存里的一個數組中黍衙。
展示數據:
自定義一個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 //還沒有開始
}
}
}
基本上就是這樣咯空盼!