我迷失了这种快速提供的想法 让我们跳进我的代码吧。
var someVar: [UIImage]!
init()
{
someFunc()
}
func someFunc() -> [UIImage]!
{
postRequest.performRequestWithHandler({
(responseData: NSData!, urlResponse: NSHTTPURLResponse!,error: NSError!) -> Void in
var err: NSError?
var jsonResult: AnyObject? = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableLeaves, error: &err)
let profileImageUrl = jsonResult!.objectForKey("profile_image_url") as! NSString
var imageOfData: NSData! = NSData(contentsOfURL: NSURL(string: profileImageUrl as String)!)
self.someVar.append(UIImage(data: imageOfData)!) // #1
})
return self.someVar //#2
}
我们假设此代码有效100%,并假设此代码位于class foo()
所以,如果我在Foo()
内创建viewController.swift
类的实例并调用someFunc()
,基本上它将返回一个空数组[UIImage]!
,因为第2行它将是在#1之前执行。我们来看看viewcontroller.swift
class ViewController: UIViewController {
var image: [UIImage]!
var someDecl: Foo = Foo()
@IBOutlet weak var img: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
self.image = self.someDecl.someVar
self.img.image = self.image // an empty image or throw an exception
}
}
如何解决这个问题? 我的问题是多线程问题? 如果有关于我的问题的一些文件,请给我一个链接,我可以获得一些知识:)
答案 0 :(得分:0)
首先,您还没有调用someFunc()
,因为您的someVar
是可选的,而未初始化,这就是为什么它返回nil。如果您不想致电someFunc()
并仍希望将image
分配给someVar
,请将以下内容添加到您的班级Foo
。
init() {
someVar=[UIImage]()
//...
}
但是,更好的解决方案是将所有代码一起更改并执行以下操作:
func someFunc() -> [UIImage]!
{
var someVar:[UIImage]!
postRequest.performRequestWithHandler({
(responseData: NSData!, urlResponse: NSHTTPURLResponse!,error: NSError!) -> Void in
var err: NSError?
var jsonResult: AnyObject? = NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableLeaves, error: &err)
let profileImageUrl = jsonResult!.objectForKey("profile_image_url") as! NSString
var imageOfData: NSData! = NSData(contentsOfURL: NSURL(string: profileImageUrl as String)!)
self.someVar.append(UIImage(data: imageOfData)!) // #1
})
return someVar //#2
}
在ViewController中:
class ViewController: UIViewController {
var image: [UIImage]!
var someDecl: Foo = Foo()
@IBOutlet weak var img: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
self.image = someDecl.someFunc()
self.img.image = self.image[0] //or something else
}
}
另请注意,在上面代码段的最后一行中,您将self.img.image
类型UIImage!
设置为[UIImage]!
,这是一个UIImage
的数组。如果您想要实现幻灯片放映,可以使用延迟并通过循环逐个设置图像。
修改强>
使用此library下载图片,这是一个魅力。