在Swift中不断更新UILabel

时间:2015-06-30 23:25:53

标签: xcode swift2

我有一个功能,如下所示,我想不断更新。它从网页上获取数据,并且每隔一段时间更新网页以反映当前信息。有没有办法可以捕获此更新并在我的应用程序中反映出来?我对Swift和iOS编程很陌生。一些代码看起来很奇怪,但它目前适用于你第一次打开应用程序时播放的任何歌曲(也就是说,它会更新文本以显示播放的歌曲,但之后不会更新)。

    let url = NSURL(string: "http://api.vicradio.org/songs/current")!
    let request = NSMutableURLRequest(URL: url)

    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request) { (data: NSData?, response: NSURLResponse?, error: NSError?) in

    if error != nil {
        return
    }

    let name = NSString(data: data!, encoding: NSUTF8StringEncoding) as! String
    var songName = ""
    var artistName = "by "
    var quoteNumber = 0

    for character in name.characters {

        if character == "\"" {
            quoteNumber++
        }

        if quoteNumber == 3 && character != "\"" {
            songName += String(character)
        } else if quoteNumber == 7 && character != "\"" {
            artistName += String(character)
        }

    }

    if (songName != "no song metadata provided") {
        self.SongNowText.text = songName
        self.ArtistNowText.text = artistName
        self.SongNowText.setNeedsDisplay()
        self.ArtistNowText.setNeedsDisplay()
    } else if (songName == "no song metadata provided") {
        self.SongNowText.text = "The Best of What's Next!"
        self.ArtistNowText.text = "only on VIC Radio"
    }

    }

    task!.resume()

1 个答案:

答案 0 :(得分:0)

看起来您正在访问的URL是一个API终结点,用于输出JSON。我强烈建议使用NSJSONSerialization.JSONObjectWithData将响应正文解析为字典并使用它而不是通过计算引号来滚动自己的解决方案。

对dataTaskWithURL的回调在后台线程上执行。避免在主线程之外的任何内容上更新UI,因为它可能会导致问题。使用dispatch_async在主线程上执行UI更新功能,如示例所示。

您可以使用此API执行的任务是发送请求并阅读响应。您可以在应用程序打开时定期轮询端点,并从中获得不错的结果。 NSTimer是一种方法,它要求你在从NSObject继承的类中重复执行你想要执行的方法,因为它依赖于Objective-C样式的消息发送。

把它扔进游乐场并尝试:

import Cocoa
import XCPlayground
XCPSetExecutionShouldContinueIndefinitely()

class RadioDataAccessor : NSObject {
    private let callback: [String : AnyObject] -> Void

    init(callback: [String : AnyObject] -> Void) {
        self.callback = callback

        super.init()

        NSTimer.scheduledTimerWithTimeInterval(5.0, target: self,
            selector: "updateData", userInfo: nil, repeats: true)
        // just so it happens quickly the first time
        updateData()
    }

    func updateData() {
        let session = NSURLSession.sharedSession()
        let url = NSURL(string: "http://api.vicradio.org/songs/current")!
        session.dataTaskWithURL(url) { data, response, error in
            if error != nil {
                return
            }

            var jsonError = NSErrorPointer()
            let json = NSJSONSerialization.JSONObjectWithData(data,
                options: NSJSONReadingOptions.allZeros,
                error: jsonError) as? [String : AnyObject]

            if jsonError != nil {
                return
            }
            dispatch_async(dispatch_get_main_queue()) { self.callback(json!) }

        }.resume()
    }
}

RadioDataAccessor() { data in
    println(data)
}

您可能希望将计时器保存到变量并公开一个让您无效的函数。