ios - UILabel takes long to load swift -


i'm trying create view of "match" image , "match price" label in top right corner of match image. far works fine- create image in container view, create uiimageview background of price label, when create actual label , customize it, takes forever load in app (that say, loads- match image, price label background image, not actual label detailing price). can spot in code i'm going wrong?

func setupminicontentscroll(contentscroll: uiscrollview) {     let scalar:double = 6/19     let contentviewdimension = contentscroll.frame.width * cgfloat(scalar)     let contentscrollwidth = cgfloat(localuser.matches.count) * (contentviewdimension + cgfloat(12)) - cgfloat(12)     contentscroll.backgroundcolor = uicolorfromhex(0x34495e)      index in 0..<localuser.matches.count {         let match = localuser.matches[index]         matchesmanager.globalmanager.retrievematchthumbnail(match) { img, error in              if let img = img {                  //create mini matches views                 let xorigin = index == 0 ? 12 : cgfloat(index) * contentviewdimension + (cgfloat(12) * cgfloat(index) + cgfloat(12))                 let contentframe = cgrectmake(xorigin, 10, contentviewdimension, contentviewdimension)                 let contentview = self.makeminicontentview(contentframe, image: img, matchedprice: match.matchedprice)                 contentview.match = match                  let tap = uitapgesturerecognizer(target: self, action: #selector(browseviewcontroller.toggleiteminfo(_:)))                 contentview.addgesturerecognizer(tap)                  //update contentscrollview                 dispatch_async(dispatch_get_main_queue()) {                     contentscroll.addsubview(contentview)                     contentscroll.contentsize = cgsizemake(contentscrollwidth + cgfloat(16), contentscroll.frame.height)                 }             }          }     } }   //functions create labels , imgviews minimymatches  func makeminicontentview(frame: cgrect, image: uiimage, matchedprice: int) -> itemcontainer {      let containerview = itemcontainer(frame: frame)      //create item image     let imgview = uiimageview(frame: cgrect(x: 0, y: 0, width: containerview.frame.width, height: containerview.frame.height))     imgview.image = image     imgview.layer.cornerradius = 5     imgview.layer.maskstobounds = true     imgview.userinteractionenabled = true      //create price label     dispatch_async(dispatch_get_main_queue()) {         let pricelabel = self.makeminipricelabel(containerview, matchedprice: matchedprice)         containerview.addsubview(imgview)         containerview.addsubview(pricelabel)     }     return containerview }  func makeminipricelabel(containerview: itemcontainer, matchedprice: int) -> uiview {     //price label var      let pricelabelframe = cgrectmake(containerview.frame.size.width - 35, -7, containerview.frame.size.width * 0.50, containerview.frame.size.height * 0.35)      //create price container     let pricecontainer = uiimageview(frame: pricelabelframe)     pricecontainer.image = uiimage(named: "venn.png")      //create price label     let pricelabel = uilabel(frame: cgrect(x: 3, y:0, width: pricecontainer.frame.width, height: pricecontainer.frame.height))      pricelabel.text = "$\(matchedprice)"     pricelabel.numberoflines = 1     pricelabel.textcolor = uicolor.whitecolor()     pricelabel.font = pricelabel.font.fontwithsize(20)     pricecontainer.addsubview(pricelabel)     return pricecontainer } 

my guess closure retrievematchthumbnail function being called on background thread. have code in closure manipulating ui objects. move ui code inside call dispatch_async():

    matchesmanager.globalmanager.retrievematchthumbnail(match) { img, error in          if let img = img {              //create mini matches views             let xorigin = index == 0 ? 12 : cgfloat(index) * contentviewdimension + (cgfloat(12) * cgfloat(index) + cgfloat(12))             let contentframe = cgrectmake(xorigin, 10, contentviewdimension, contentviewdimension)              //update contentscrollview             dispatch_async(dispatch_get_main_queue()) {               let contentview = self.makeminicontentview(contentframe, image: img, matchedprice: match.matchedprice)             contentview.match = match                let tap = uitapgesturerecognizer(target: self, action: #selector(browseviewcontroller.toggleiteminfo(_:)))             contentview.addgesturerecognizer(tap)                contentscroll.addsubview(contentview)               contentscroll.contentsize = cgsizemake(contentscrollwidth + cgfloat(16), contentscroll.frame.height)             }         }      } 

Comments