当一个func仍在执行时,它将返回nil

时间:2015-06-16 17:55:22

标签: xcode swift

我迷失了这种快速提供的想法 让我们跳进我的代码吧。

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 
     }
}

如何解决这个问题? 我的问题是多线程问题? 如果有关于我的问题的一些文件,请给我一个链接,我可以获得一些知识:)

1 个答案:

答案 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下载图片,这是一个魅力。