iosiphoneswiftnsnotificationcenteriphone-4

Observer being added after postNotification ONLY on iPhone 4S


I have a fully functional code that works perfectly on iOS >8.0 for iPhones >5 and all iPads, where I pass information and call function via Observers/Notifications, but on iPhone 4S it just doesn't work.

Through debugging, I actually found out that ONLY while running on iPhone 4S the observer gets added AFTER the notification gets posted.

This is happening on devices and on the simulator, on iOS 8 and 9, respectively.

Code:

**PostNotification**
override func viewDidLoad() {
    super.viewDidLoad()

    self.registerCells()

    UIApplication.sharedApplication().statusBarStyle = .LightContent

    self.collectionView.delaysContentTouches = false

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "footerUpdateContentSize:", name: "footerUpdateContentSize", object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "seasonUpdateContentSize:", name: "seasonUpdateContentSize", object: nil)

    self.loadDetailTVShow()
}

func registerCells()
{
    self.collectionView.registerClass(HeaderDetailSeriesCell.self, forCellWithReuseIdentifier: "HeaderDetailSeriesCell")
    self.collectionView.registerClass(FooterDetailSeriesCell.self, forCellWithReuseIdentifier: "FooterDetailSeriesCell")
    self.collectionView.registerClass(SeriesSeasonContentCell.self, forCellWithReuseIdentifier: "SeriesSeasonContentCell")
}


func loadDetailTVShow()
{
    let id: String! = (tvShow != nil) ? tvShow!.id! : episode!.seriesId!

    ContentsClient().getContentById(id!).then { data -> Void in
        let m: TVShow? = data as! TVShow?
        self.tvShow = m!
        self.collectionView.reloadData()

        NSNotificationCenter.defaultCenter().postNotificationName("loadedTvShowlist", object: self.tvShow)

        UIView.animateWithDuration(1.0, delay: 0, options: .TransitionNone, animations:
            {
                self.loadingView.alpha = 0.0

            }, completion:nil)
    }
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
{
    cell = collectionView.dequeueReusableCellWithReuseIdentifier("SeriesSeasonContentCell", forIndexPath: indexPath)

    let seriesContent = cell as! SeriesSeasonContentCell

    seriesContent.seriesContentCell?.tvShow = self.tvShow

    seriesContent.contentView.frame = CGRect(x: 0.0, y: 0.0, width: width, height: heightSeason)
    seriesContent.seriesContentCell?.view.frame = seriesContent.contentView.frame
}

**Observer**

class SeriesSeasonContent

override func viewDidLoad() {
    super.viewDidLoad()

    self.registerCells()

    seasonSelectedIndex = 0

    collectionView.reloadData()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "loadedTvShowlist:", name: "loadedTvShowlist", object: nil)
}

func registerCells ()
{
    self.seasonCollection.registerClass(SeasonViewCell.self, forCellWithReuseIdentifier: "SeasonViewCell")

    self.collectionView.registerClass(EpisodeViewCell.self, forCellWithReuseIdentifier: "EpisodeViewCell")
}

func loadedTvShowlist(notification : NSNotification){
    self.tvShow = notification.object! as? TVShow

    if (tvShow?.seasons != nil && tvShow?.seasons?.count > 0)
    {
        self.currentSeason = ((tvShow?.seasons!.objectAtIndex(seasonSelectedIndex) as? Season)?.episodes)!

        self.collectionView.reloadData()
        self.seasonCollection.reloadData()
    }
}

Obs: Im using multiple collectionviews in the same view, and the nib files are named correctly

Is there any reason why the iPhone 4S does load the viewDidLoad method after the notification has been posted?


Solution

  • Managed to solve my problem. The iphone 4s screen size wasn't big enough to trigger the cellForIndex event and the class/observer wasn't initiated until the phone screen scrolled down.