NSTimer在窗口关闭后启动,停止和继续

时间:2015-05-05 22:34:59

标签: macos swift nstimer nsimageview

所以这就是人类逻辑中发生的事情(但不是假设)。

  1. 我的视图控制器加载
  2. 从Parse成功检索我的图像
  3. 将第一个检索到的图像设置为等于我的UIImageView图像
  4. 启动我的5秒计时器(我认为)
  5. 然后它没有做任何事情,只留在第一张图片上
  6. 关闭窗口(由前一个视图控制器以模态方式显示)后,我在控制台中看到我的println()输出,我的计时器开始工作。
  7. 目标:在我的UIImageView中显示图像5秒左右,然后在线显示下一个图像(imageArray)。

    是我的计时器导致功能暂停,还是与我的代码安排有关?所有建议/帮助都非常感谢,因为这是一个非常令人沮丧的问题。

    这是Swift语言,但我可以阅读Objective-C。

    这是我的课程代码:

    //
    //  ImageDisplayViewController.swift
    //  
    //
    //  Created by on 5/3/15.
    //
    //
    
    import Cocoa
    import ParseOSX
    
    class ImageDisplayViewController: NSViewController {
    
    
    @IBOutlet weak var imageView: NSImageView!
    
    var venue: String!
    var imageArray = [(Int, NSImage)]()
    var image: NSImage!
    var timeToDisplay: Int = 0
    
    var timer = NSTimer()
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        venue = "Bees"
        loadImages()
    
    
    }
    
    var k: Int = 0
    
    func presentNextImage() {
        if(k<imageArray.count) {
        imageView.image = imageArray[k].1
        timer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: Selector("presentNextImage"), userInfo: nil, repeats: false)
            println(timer.timeInterval)
            //imageView.image = imageArray[k].1
            println("k is \(k)")
            k++
            println("Just set a new imageView.image")
        } else {
            println("K is n longer <imageArray.count")
        }
    }
    
    
    
    func loadImages() {
        var query = PFQuery(className:groupz)
        query.whereKeyExists("imageFile")
        query.findObjectsInBackgroundWithBlock {
            (objects: [AnyObject]?, error: NSError?) -> Void in
    
            if error == nil {
                println("Successfully retrieved \(objects!.count) objects.")
                // Do something with the found objects
                if let objects = objects as? [PFObject] {
                    for object in objects {
                        let thumbNail = object["imageFile"] as! PFFile
                        self.image = NSImage(data: thumbNail.getData()!)
                        let time: AnyObject? = object["displayTime"]
                        self.timeToDisplay = time!.integerValue
    
                        let tempTuple = (self.timeToDisplay, self.image!)
                        self.imageArray.append(tempTuple)
    
                    }
                }
                println("imageArray.count is: \(self.imageArray.count)")
                self.presentNextImage()
            } else {
                // Log details of the failure
                println("Error: \(error!) \(error!.userInfo!)")
            }
        }
    }
    

    }

2 个答案:

答案 0 :(得分:2)

将您的NSTimer声明为weak。来自NSTimer上的Apple docs

  

特别注意,run循环保持对它们的强引用   定时器,所以你不必保持自己强烈的参考   将它添加到运行循环后的计时器。

此外,您实际上不需要维护对计时器的引用,因为您没有在选择器参数中调用的方法之外调用invalidate,在您的情况下,恰好是方法分配计时器。

在您的情况下,保持对计时器的弱引用并使其无效以将其从viewWillDisappear:中的运行循环中删除。

Timer Programming Topics - Cocoa concept

答案 1 :(得分:0)

我发现了问题。出于某种原因,将我的视图控制器(显示图像的控制器)显示为Modal会导致计时器无法运行或可能被添加到NSRunLoop。我对此并不十分肯定。但是一旦我将Segue改为Show我的计时器开始正常工作。

感谢Nikita的帮助,我从你的问题答案中学到了很多东西。