Ios Swift-通过应用程序使用数据

Ios Swift-通过应用程序使用数据,ios,swift,ios8,Ios,Swift,Ios8,我正在开发每日报价应用程序,因此我创建了报价类: import Foundation class Quote { let quote: String? let author: String? let backgroundImage: UIImage? } 然后,我创建了一个加载屏幕,该屏幕从外部数据库获取当天的报价数据,并使用数据fecthed从类quote创建一个新实例: import UIKit import Parse class LoadingViewController:

我正在开发每日报价应用程序,因此我创建了报价类:

import Foundation
class Quote {
  let quote: String?
  let author: String?
  let backgroundImage: UIImage?
}
然后,我创建了一个加载屏幕,该屏幕从外部数据库获取当天的报价数据,并使用数据fecthed从类quote创建一个新实例:

import UIKit
import Parse
class LoadingViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    //
    //check for internet connection and fecth data
    //
    //assign each data to a variable of quote object 
    ///q, a and bI are variables that represents quote, author and image

    let quoteOfTheDay = Quote()
    quoteOfTheDay.quote = q
    quoteOfTheDay.author = a
    quoteOfTheDay.backgroundImage = bI

    //---perform segue to main view controller
  }

}
之后,我想与我的所有其他ViewController共享此每日报价实例,直到我的应用程序终止。如果退出,用户将再次被引导到加载视图控制器以获取数据。否则,此quoteOfTheDay实例需要保持活动状态,并被其他屏幕使用,就像它在应用程序活动时被缓存一样。我该怎么做

注意,我不想继续使用prepareForSegue传递这个实例


谢谢大家!

您是否考虑过将Quote对象写入磁盘存档?也许在应用程序支持方面?通过使用使用引用生成日期的命名约定,用户甚至可以在当天稍后的启动中检索它。然后,您可以在下一次发布的另一天将其删除。

您可以使用这样的单例:

import Foundation
class Quote {
  let quote: String?
  let author: String?
  let backgroundImage: UIImage?

  class var sharedInstance: Quote {
    struct Singleton {
      static let instance = Quote()
    }
    return Singleton.instance
  }
}
现在你可以打电话了

Quote.sharedInstance
有关swift中设计模式的更多详细信息

您将在中找到许多针对singleton的代码演示

@rmaddy和@adamPro提出了我忘记提到的重要方面:

  • 您必须小心使用此设计器,因为它会保留在内存中一段时间 应用程序的生命周期(因此此处不加载图像和视频,请执行以下操作 不要滥用这种设计师)
  • 正如名称所示,如果您认为将来可能需要创建一个singleton实例,那么您可以只创建一个实例 寻找一种更合适的方法来使用
  • Singleton在苹果社区的大多数人看来都不是很好,似乎这一点随着swift而改变,但它在其他语言中被广泛使用

您可以在Quote类中设置静态属性来存储当天的报价

class Quote: NSObject {
     static var quoteOfTheDay: Quote?

     //Other Quote Code...
}
然后访问:

let quote = Quote.quoteOfTheDay as Quote!

请记住,如果您尝试使用上述方法访问quoteOfTheDay时quoteOfTheDay为零,则应用程序将崩溃。因此,您要么想以更安全的方式访问它,要么不将其存储为可选的。

谢谢您的回答!很抱歉,我不熟悉应用程序支持方面的写作。在加载屏幕上,我获取当前日期(NSDate),并在将其转换为字符串后,在Parse.com数据库上异步查找日期与应用程序上日期相同的引号。我正在考虑将我创建的实例(quoteOfTheDay)全局化到整个项目中,以便任何vc都可以访问它。但是,我担心这可能会导致以后出现一些内存问题。你推荐这种方法吗?此外,我还考虑放弃Quotes对象,在获取数据后,使用NSUserDefault存储数据,并在必要时使用它获取数据。你的想法是什么?谢谢编写和访问并不难学,应用程序中的任何类都可以随时访问。此外,它还可以保护您的用户免受电话中断、电源故障等的影响。如果发生某种情况,您的应用程序可以从磁盘还原当天的报价。如果我实现了这一点,那么我应该如何创建报价类的singleton实例?就好像这是一门普通的课?谢谢你的回答@TChad在singleton类上添加了quote属性。@AdamPro13非常感谢您的帮助!它起作用了!但是,你认为这会给我以后的记忆问题吗?我从视图控制器创建的对象(例如:let question=Quote.sharedInstance)是否会保留在内存中(与视图控制器一起)或者它们会被释放?如果singleton有一个对它的强引用,那么quote对象将保留在内存中,但这可能不会导致任何问题,除非您开始在内存中保留数千个对象。具有引用的单例不会将视图控制器保留在内存中,除非您从引用创建对视图控制器的引用。@IcaroNZ我理解单例设计模式。我只是想说,随着应用程序需求的变化,当你后来发现它是一个错误的选择时,它往往会被过度使用。Quote类本身就是一个模型。最终,我可能会将抓取移到init方法。