2016-01-21 2 views
2

У меня есть настраиваемая настройка делегата/протокола. Я использую alamofire для запроса запроса, а затем разбираю json. Json помещается в объекты Swift и возвращается обратно в контроллер представления коллекции. За исключением того, что делегат, чтобы отправить их обратно, никогда не будет вызван. Все остальное прекрасно работает. Вот мой соответствующий код:Делегат не вызван

class ViewController: UICollectionViewController, MainCatGallery { 

var cats = [Cats]() 
let theManager = ImgurAPIManager() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    loadCats() 
    theManager.delegate = self 

} 

    func gotCatsArray(x: [Cats]) { 
     self.cats = x 
     self.collectionView?.reloadData() 
    } 
} 

и:

protocol MainCatGallery { 
func gotCatsArray(x: [Cats]) 
} 


class ImgurAPIManager: NSObject { 

static let sharedInstance = ImgurAPIManager() 
let jsonClass = ParseJson() 
var delegate:MainCatGallery? 
var catGallery = [Cats]() 

func getGallery() { 
    Alamofire.request(Router.Get) 
    .response { (request, response, data, error) -> Void in 
     do { 
      let jsonDict = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) 
      self.catGallery = self.jsonClass.parseCatGalleryJson(jsonDict) 
      for x in self.catGallery { 
       print(x.url!) 
      } 
      self.delegate?.gotCatsArray(self.catGallery) 

     } 
     catch { 

     } 
     } 

    } 

} 

Все это работает отлично - оператор печати в getGallery() функция печатает каждый URL, как и ожидалось. Просто, когда идет вызов делегата, он никогда не передает объекты обратно в контроллер представления. И установка контрольных точек показывает, что он никогда не передает данные назад.

Я использовал этот точный шаблон раньше в других проектах для делегатов/протоколов и никогда не испытывал проблем. Любые идеи, почему его не называют?

+1

Где и когда вы называете 'getGallery'? Вызывается ли он контроллером вида, когда он вызывает 'loadCats()'? –

+0

Вы создаете новый экземпляр ImgurAPIManager и назначаете ему делегат. Либо используйте sharedInstance, чтобы установить делегат или сделать свой делегат статичным. –

+0

@Roman yes loadCats() вызывает метод get gallery, но DanBeaulieu ответил правильно. ImgurAPIManager.sharedInstance.delegate = self является правильным. ответьте, и я приму это. – joey

ответ

2

В вашем классе ImgurAPIManager у вас есть общий экземпляр, который вы можете использовать для установки вашего делегата.

static let sharedInstance = ImgurAPIManager() 

Однако в вашем ViewController вы создали новый экземпляр и установить делегат:

let theManager = ImgurAPIManager() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    theManager.delegate = self 
} 

Изменить эту строку:

theManager.delegate = self 

Для этого:

ImgurAPIManager.sharedInstance.delegate = self 

Как Roman Sausarnes отметил ниже:

И чтобы избежать такого рода путаница в будущем, вы можете отметить свой ImgurAPIManager инициализатору private: private init() { }. Таким образом, вы не можете случайно создавать экземпляры извне файла. -

+2

И, чтобы избежать такого рода смешивания в будущем, вы можете пометить свой '' ImgurAPIManager' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. Таким образом, вы не можете случайно создавать экземпляры извне файла. –

+0

@ RomanSausarnes очень хорошая точка –

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