gpt4 book ai didi

ios - 让实例等到被调用的函数完成 - Swift

转载 作者:可可西里 更新时间:2023-11-01 00:52:51 24 4
gpt4 key购买 nike

如果这个问题已经得到回答,我提前道歉,但正如您可能从标题中看出的那样,我不太确定如何描述这个问题,而且我发现对类似问题的回答没有帮助。

在 init 方法中将 id 传递给数据库后,我试图创建一个“优惠券”的实例,该实例的属性从 SQL 数据库加载。

我的问题是,当我从另一个 viewController 类调用 init 方法时,它将返回具有默认字符串值“”的实例,因为来自 NSURLConnection 的数据在返回到 viewContoller 之前没有被/解码。

我正在寻找一种解决方案,以解决如何使 init 方法等待字段加载完毕的问题。

优惠券类相关属性:

var webData: NSMutableData?

var id: Int
var name: String = ""
var provider: String = ""
var details: String = ""

优惠券类相关方法:

convenience init(id: Int) {

self.init()
self.id = id

self.selectSQL(id) //passes id to server and returns all other varibles

}

func selectSQL(id: Int) {

let url = NSURL(string: "http://wwww.website.php?id=\(id)") // acess php page
let urlRequest = NSURLRequest(URL: url!)
let connection = NSURLConnection(request: urlRequest, delegate: self)

}

func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse) {

webData = NSMutableData()

}

func connection(connection: NSURLConnection, didReceiveData data: NSData) {

webData?.appendData(data)

}

func connectionDidFinishLoading(connection: NSURLConnection) {

let result = NSJSONSerialization.JSONObjectWithData(webData!, options: .AllowFragments, error: nil) as? NSArray

let resultDict = result?[0] as? NSDictionary

if let dict = resultDict {

name = dict.objectForKey("name") as! String
provider = dict.objectForKey("provider") as! String
details = dict.objectForKey("details") as! String

}

最佳答案

不可能“等待您的 SQL 完成”然后从 init 返回而不阻塞您的线程(同步),这不是您想要的。

我建议使用带有回调的工厂方法来解决它。像这样:

class Coupon {
private var handler: ((coupon: Coupon) -> ())?

class func createCoupon(id: Int, completionHandler: ((coupon: Coupon) -> ())?) {
let coupon = Coupon(id: id)

// Store the handler in coupon
coupon.handler = completionHandler
}

//...

func connectionDidFinishLoading(connection: NSURLConnection) {

//...Setup coupon properties
handler?(coupon: self)
handler = nil
}
}

然后您可以像这样创建和使用您的优惠券:

Coupon.createCoupon(1, completionHandler: { (coupon) -> () in
// Do your thing with fully "inited" coupon
})

当然,你还需要考虑到你的服务器连接失败的情况,有可能调用handler有错误,这在你当前的代码中是不存在的。

关于ios - 让实例等到被调用的函数完成 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31282569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com