2015-06-16 5 views
0

Я потерялся с этой идеей, что быстрое предоставление Давайте перейдем в код, который у меня есть.swift func возвращает ноль, пока он все еще выполняется

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

Во-первых, Вы не заехали someFunc(), и так как ваш someVar является необязательным, и не инициализируется, поэтому его возвращает ноль. Если вы не хотите звонить 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 s , Если вы хотите достичь слайд-шоу, вы можете использовать задержку и устанавливать изображения поочередно через цикл.

EDIT:

Используйте этот library для загрузки изображений, это очарование.

+0

Извините, я набирал все очень быстро, просто хотел дать представление о моей проблеме, даже несмотря на то, что ваш код производит ту же ошибку «неожиданно нашел нуль при разворачивании необязательного значения» в соответствии с вашей новой Декларацией моей функции он вернет someVar как ниль, поскольку он все еще загружает изображения из Интернета, см. раздел Capturing, который он запускает в новом процессе, и продолжайте выполнение остальной части кода функции. Я отредактирую свой код Снова –

+0

Я нашел библиотеку, которая поможет вам избавиться от всей части нитей, которая вызывает возврат nil. Я просто добавлю это к ответу. –

+0

спасибо :) плохо протестируйте его и обновите полный ответ, если он сработает для меня –

Смежные вопросы