2014-10-29 4 views
0

У меня есть ViewContoller, загрузить класс и класс для работы с данными в ViewContoller необходимости метод вызова для загрузки данных из Интернета, после NSNotificationcenter отправить полное сообщение, и рабочий класс с данными, после того, как в моем таблица Я использую данные перезарядкаSwift NSNotificationCenter добавить наблюдатель FUNC в другом классе

Проблема - notifCenter.postNotificationName("completeLoadService", object: complete) Thread1: EXC_BAD_ACCESS (code = 1, address = 0x10)

override func viewDidLoad() { 
    super.viewDidLoad() 

    ServicesLoad.loadServicesFromSite() 

    let center : NSNotificationCenter = NSNotificationCenter.defaultCenter() 

    var load : LoadServiceTrainersAreasClubs = LoadServiceTrainersAreasClubs() 

    center.addObserver(load, selector: Selector("loadService:"), name: "completeLoadService", object: nil) 
} 

загрузить класс

 operation.setCompletionBlockWithSuccess({ 
     (operation : AFHTTPRequestOperation!, servicesData : AnyObject!) -> Void in 

     //some code 

      var complete : Bool = Bool() 
      complete = true 

      var notifCenter : NSNotificationCenter = NSNotificationCenter.defaultCenter() 
      notifCenter.postNotificationName("completeLoadService", object: complete) 

     }) 

класс работы с LoadServiceTrainersAreasClubs данных

func loadService(notif : NSNotification){ 

    println("complete") 

} 

ответ

1

LoadServiceTrainersAreasClubs является локальной переменной. У вас нет сильной ссылки на него. Он будет освобожден после выхода метода viewDidLoad. NSNotificationCenter сохраняет наблюдателей как слабые ссылки. Таким образом, похоже, NSNotificationCenter пытается уведомить вашего настроенного наблюдателя, но он был освобожден, что приводит к сбою.

Кроме того, я бы рекомендовал не использовать центр уведомлений для чего-то подобного. Я бы предложил использовать блок или делегат для информирования потребителя об этом завершении службы.

+0

Переменная называется 'load',' LoadServiceTrainersAreasClubs' является типом. Но ваш вывод прав: объект освобождается к моменту доставки уведомления. Но почему было бы плохой идеей использовать центр уведомлений «вот так»? – DarkDust

+0

NSNotificationCenter на мой взгляд, используется для простых от 1 до 1 отношений. Это решение шаблона проектирования наблюдателя, которое обычно используется для отношений от 1 до многих. Это может привести к путанице, а блоки/блокировки, используемые в качестве механизма обратного вызова, способствуют созданию более читаемого кода. –

+0

Для отношений 1: 1 Я полностью согласен с вами, вот для чего нужен шаблон делегата. – DarkDust

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