Ministerul Educației Republicii Moldova
Universitatea Tehnică a Moldovei
Facultatea Calculatoare, Informatică și Microelectronică
Departamentul ISA
Raport
Lucrare de laborator Nr.4
La Programarea Aplicațiilor Mobile
Tema: Simple HTTP Client (Web Service Emulation)
A efectuat:
st. gr. TI-151 FR
A verificat:
lector universitar Antohi Ion
Chișinău 2018
Obiective: De realizat emularea programatică a unui serviciu web.
Scopul: De realizat o aplicație ce va încărca de pe o resursă web (preferată, ex:
[Link] ) fluxul RSS al acesteia.
Condiții: Serviciul web va fi emulat programatic utilizând metodele protocolului HTTP (GET )
a) posibilitate de adăugare 2 sau mai multe fluxuri RSS
b) posibilitate de a naviga către postarea din fluxul încărcat
c) salvarea locală a fluxului cu păstrarea sa pînă utilizatorul nu o va distruge
În fig. 1 este aplicația care afișează ultimele noutăți de la sursa RSS specificată. Fiecare articol are titlu,
data, descriere pe scurt și descriere pe lung.
Fig. 1
Apăsând pe unul din titluri, descrierea se va extinde de la 3 rânduri pănă la conținutl maxim al acestuia
oferind descrierea deplină. Vezi fig. 2
Fig. 2
Concluzie: Efectuând această lucrare de laborator, am înțeles cum se construiește o aplicație care să
citească informația de pe un site web cu ajutorul RSS.
Anexa
XMLParser
import Foundation
struct RSSItem {
var title: String
var summary: String
var updated: String
}
class FeedParser: NSObject, XMLParserDelegate {
private var rssItems: [RSSItem] = []
private var currentElement = ""
private var currentTitle: String = "" {
didSet {
currentTitle = [Link](in: [Link])
}
}
private var currentSummary: String = "" {
didSet {
currentSummary = [Link](in: [Link])
}
}
private var currentUpdated: String = "" {
didSet {
currentUpdated = [Link](in: [Link])
}
}
private var parserCompletionHandler: (([RSSItem]) -> Void)?
func parseFeed(url: String, completionHandler: (([RSSItem]) -> Void)?)
{
[Link] = completionHandler
let request = URLRequest(url: URL(string: url)!)
let urlSession = [Link]
let task = [Link](with: request) { (data, response, error) in
guard let data = data else {
if let error = error {
print([Link])
}
return
}
/// parse our xml data
let parser = XMLParser(data: data)
[Link] = self
[Link]()
}
[Link]()
}
// MARK: - XML Parser Delegate
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?,
qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
currentElement = elementName
if currentElement == "entry" {
currentTitle = ""
currentSummary = ""
currentUpdated = ""
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
switch currentElement {
case "title": currentTitle += string
case "summary" : currentSummary += string
case "updated" : currentUpdated += string
default: break
}
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?,
qualifiedName qName: String?) {
if elementName == "entry" {
let rssItem = RSSItem(title: currentTitle, summary: currentSummary, updated:
currentUpdated)
[Link](rssItem)
}
}
func parserDidEndDocument(_ parser: XMLParser) {
parserCompletionHandler?(rssItems)
}
func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
print([Link])
}
NewsTableCell
class NewsTableViewCell: UITableViewCell {
@IBOutlet weak var titleLabel:UILabel!
@IBOutlet weak var descriptionLabel:UILabel! {
didSet {
[Link] = 3
}
}
@IBOutlet weak var dateLabel:UILabel!
var item: RSSItem! {
didSet {
[Link] = [Link]
[Link] = [Link]
[Link] = [Link]
}
}
}
NewsTableView
class NewsTableViewController: UITableViewController
{
private var rssItems: [RSSItem]?
private var cellStates: [CellState]?
override func viewDidLoad() {
[Link]()
[Link] = 155.0
[Link] = UITableViewAutomaticDimension
fetchData()
}
private func fetchData()
{
let feedParser = FeedParser()
[Link](url: "[Link] { (rssItems) in
[Link] = rssItems
[Link] = Array(repeating: .collapsed, count: [Link])
[Link] {
[Link](IndexSet(integer: 0), with: .left)
}
}
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// Return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
guard let rssItems = rssItems else {
return 0
}
// rssItems
return [Link]
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->
UITableViewCell
{
let cell = [Link](withIdentifier: "Cell", for: indexPath) as!
NewsTableViewCell
if let item = rssItems?[[Link]] {
[Link] = item
[Link] = .none
if let cellStates = cellStates {
[Link] = (cellStates[[Link]] == .expanded) ? 0 : 4
}
}
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
[Link](at: indexPath, animated: true)
let cell = [Link](at: indexPath) as! NewsTableViewCell
[Link]()
[Link] = ([Link] == 0) ? 3 : 0
cellStates?[[Link]] = ([Link] == 0) ? .expanded :
.collapsed
[Link]()
}