基于 Web 服务实现快速更新行的标签
Posted
技术标签:
【中文标题】基于 Web 服务实现快速更新行的标签【英文标题】:Updating row's label based of web service implementation swift 【发布时间】:2015-11-02 14:48:48 【问题描述】:我有一个包含 7 行的表格视图,周一、周二、....、周日。我的应用从 Web 服务接收到一个 json,其格式为:
(
appointments = (
numApts = 1;
scheduleDate = "2015-11-02";
,
numApts = 2;
scheduleDate = "2015-11-04";
);
)
所以我试图遍历 json 响应并更新我们工作日的标签,如果它与收到的 json 中的日期匹配。
不确定如何实现。我需要一个模型课吗?比如:
import UIKit
class CurrentRosterModel
var numApts : String?
var scheduleDate : String?
init(json : NSDictionary)
self.numApts = json["numApts"] as? String
self.scheduleDate = json["scheduleDate"] as? String
我今天尝试的是一个像这样更新行文本的函数,但我没有进入最终的 if let 条件来访问单元格以更新标签:
let weekDateDict = ["Monday" : mon, "Tuesday" : tues, "Wednesday" : wedns, "Thursday" : thurs, "Friday" : fri, "Saturday" : sat, "Sunday" : sun]
//where vars mon = "2015-11-02", tues = "2015-11-03" etc.
//aptsArray is hard coded for now but will need to come from a web service response later
let aptsArray : [Dictionary<String, String>] = [
[
"numApts" : "1",
"scheduleDate" : "2015-11-02"
],
[
"numApts" : "2",
"scheduleDate" : "2015-11-04"
]];
for (weekDay, weekDate) in weekDateDict
if aptsArray.contains( $0.values.contains(weekDate))
print("Matched with weekDate is \(weekDate) and weekDay is \(weekDay)")
//getting this condition twice as expected
let ourIndexPath : NSIndexPath?
switch weekDay
case "Monday":
ourIndexPath = NSIndexPath(forRow: 0, inSection : 0)
//print("Monday label update")
case "Tuesday":
ourIndexPath = NSIndexPath(forRow: 1, inSection : 0)
//print("Tuesday label update")
case "Wednesday":
ourIndexPath = NSIndexPath(forRow: 2, inSection : 0)
//print("Wednesday label update")
case "Thursday":
ourIndexPath = NSIndexPath(forRow: 3, inSection : 0)
//print("Thursday label update")
case "Friday":
ourIndexPath = NSIndexPath(forRow: 4, inSection : 0)
//print("Friday label update")
case "Saturday":
ourIndexPath = NSIndexPath(forRow: 5, inSection : 0)
//print("Saturday label update")
case "Sunday":
ourIndexPath = NSIndexPath(forRow: 6, inSection : 0)
//print("Sunday label update")
default :
ourIndexPath = NSIndexPath(forRow: 7, inSection : 0)
//print("swicth not satisfied")
if let cell = weekTableView.cellForRowAtIndexPath(ourIndexPath!) as? WeekDayCell
print("got in here")//not getting in here
cell.numAptsLbl.text = aptsArray[0]["numApts"]!
weekTableView.beginUpdates()
weekTableView.reloadRowsAtIndexPaths([ourIndexPath!], withRowAnimation: UITableViewRowAnimation.Automatic)
weekTableView.endUpdates()
我的 tableview 方法如下所示:
func numberOfSectionsInTableView(tableView: UITableView) -> Int
return 1
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return 7
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = weekTableView.dequeueReusableCellWithIdentifier("WeekDayCell", forIndexPath: indexPath) as! WeekDayCell
cell.dayLbl?.text = weekArray[indexPath.row]
cell.numAptsLbl?.text = "0"
//indexPath.row.description
//print("indexpath in tableview is \(indexPath)")
return cell
【问题讨论】:
【参考方案1】:假设
首先,您发布的 json 示例不是有效的 json,而是您将在调试器中看到的输出。我假设 json 将类似于以下格式:
"appointments": [
"numApts": 1,
"title": "Coffee",
"scheduleDate": "2015-11-02"
,
"numApts": 2,
"title": "Shower",
"scheduleDate": "2015-11-04"
,
"numApts": 3,
"title": "Rollercoaster!!!!",
"scheduleDate": "2015-12-24"
]
TL;DR
我建议您创建一个代表单个约会的Appointment
模型。然后,您应该创建一个包装器,围绕该包装器存储所有约会,并根据工作日进行过滤。您可以将此包装器命名为您认为适合您项目的任何名称。
代码示例
我已经尝试为您想要实现的内容汇总最简单的案例。希望代码中使用的命名足以说明问题。
我认为这将有助于回答您的问题并让您从这里开始。我的代码输出将类似于下图:
现在,我需要强调一点,在您开始在生产中使用类似的东西之前,您需要注意这里和那里的一些强制展开。
Appointment.swift
:
//
// Appointment.swift
// WeekDays
//
// Created by Stefan Veis Pennerup on 02/11/15.
// Copyright © 2015 Kumuluzz. All rights reserved.
//
import Foundation
struct Appointment
// MARK: - Formatter
private static var DateFormatter: NSDateFormatter =
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
return formatter
()
// MARK: - Properties
let numApts: Int
let title: String
let scheduleDate: NSDate
// MARK: - Initializers
init(json: [String: AnyObject])
numApts = json["numApts"] as? Int ?? 0
title = json["title"] as? String ?? ""
let dateString = json["scheduleDate"] as? String ?? ""
scheduleDate = Appointment.DateFormatter.dateFromString(dateString) ?? NSDate()
WeekDaysModel.swift
:
//
// WeekDays.swift
// WeekDays
//
// Created by Stefan Veis Pennerup on 02/11/15.
// Copyright © 2015 Kumuluzz. All rights reserved.
//
import Foundation
enum WeekDay: Int
// Sunday has been set as the initial index, because the NSDateComponents
// has been created with Sunday as the initial day with an index of 1.
// This is being taken into consideration in the getWeekDayIndexForDate()
case Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
struct WeekDaysModel
// MARK: - Properties
var appointments: [WeekDay: [Appointment]] = [
WeekDay.Monday:[],
WeekDay.Tuesday:[],
WeekDay.Wednesday:[],
WeekDay.Thursday:[],
WeekDay.Friday:[],
WeekDay.Saturday:[],
WeekDay.Sunday:[]
]
// MARK: - Initializers
init()
init(json: [String: AnyObject])
// Ensures there is data
guard let appointmentsJson = json["appointments"] as? [[String: AnyObject]] else
return
// Parses the data points to the Appointment model
let apts = appointmentsJson.map json in
return Appointment(json: json)
// Assigns each Appointment to a weekday
_ = apts.map apt in
let i = getWeekDayIndexForDate(apt.scheduleDate)
appointments[WeekDay(rawValue: i)!]! += [apt]
// MARK: - Helpers
private func getWeekDayIndexForDate(aDate: NSDate) -> Int
let cal = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
let comp = cal.components(.Weekday, fromDate: aDate)
return (comp.weekday - 1)
ViewController.swift
:
//
// ViewController.swift
// WeekDays
//
// Created by Stefan Veis Pennerup on 02/11/15.
// Copyright © 2015 Kumuluzz. All rights reserved.
//
import UIKit
class ViewController: UITableViewController
// MARK: - Properties
private var model = WeekDaysModel()
didSet
tableView.reloadData()
// MARK: - Lifecycle methods
override func viewDidLoad()
super.viewDidLoad()
Backend.downloadAppointments
self.model = $0
// MARK: - UITableViewDelegate
// MARK: - UITableViewDataSource
override func numberOfSectionsInTableView(tableView: UITableView) -> Int
return model.appointments.count
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return model.appointments[WeekDay(rawValue: section)!]!.count
override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?
return String(WeekDay(rawValue: section)!)
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCellWithIdentifier("myCell")!
let apts = model.appointments[WeekDay(rawValue: indexPath.section)!]!
cell.textLabel?.text = apts[indexPath.row].title
return cell
Backend.swift
:
//
// Backend.swift
// WeekDays
//
// Created by Stefan Veis Pennerup on 02/11/15.
// Copyright © 2015 Kumuluzz. All rights reserved.
//
import Foundation
import Alamofire
struct Backend
static func downloadAppointments(handler: (WeekDaysModel)->Void)
let url = "http://stefanveispennerup.com/so.json"
Alamofire.request(.GET, url).responseJSON response in
// TODO: Check response code, etc..
if let json = response.result.value as? [String: AnyObject]
let model = WeekDaysModel(json: json)
handler(model)
【讨论】:
以上是关于基于 Web 服务实现快速更新行的标签的主要内容,如果未能解决你的问题,请参考以下文章
具有 3000 个标签和 1000000 行的分类器,内存错误
《ClickHouse企业级应用:入门进阶与实战》8 基于ClickHouse Bitmap实现DMP用户画像标签圈人