2016-05-07 2 views
1

Я запускаю серию рассылок, а когда окончательный закончен, я хочу изменить ярлык кнопки. Однако изменение swift не нравится, когда изменения компонентов пользовательского интерфейса сделаны вне основного потока. Иногда это работает. Иногда это не так. И странно, когда это не так, если я нажимаю на значок точки останова (независимо от того, если я активируя все контрольные точки, или отключить, метка сразу меняется по желанию.Swift 2 Button Изменение текста метки при завершении потока

@IBAction func runButtonSelected(sender: AnyObject) { 
     runButton.setTitle("Stop Run", forState: UIControlState.Normal) 
     isRunning = true 
     self.run() 
    } 

.

func run() { 
    let thread = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 

    NSThread.sleepForTimeInterval(1) 
    dispatch_async(thread, { 
     NSThread.sleepForTimeInterval(1) 
     .   
     . 
     . 
     .  
     var request = Request(URL: NSURL(string: url+params)!, method: "GET", params: "") 
     request.isRequesting = true 
     queue.addOperation(request) 
     request.threadPriority = 0 
     request.completionBlock = {() ->() in 
      request.execute() 
      NSThread.sleepForTimeInterval(2) 
     } 
     while request.isRequesting { 
      if !request.isRequesting { 
       break 
      } 
     } 

     . 
     . 
     . 
     .   
     /* visit user profiles based on match results */ 
     for (index, profile) in profiles.enumerate() { 
      let URL = NSURL(string: "https://www.somewebsite.com/profile/\(profile)")! 
      let request = Request(URL: URL, method: "GET", params: "") 

      var contentsOfURL = NSString() 
      request.isRequesting = true 
      queue.addOperation(request) 
      request.threadPriority = 0 
      request.completionBlock = {() ->() in 
       request.execute() 
      } 
      NSThread.sleepForTimeInterval(1) 
     } 

     self.isRunning = false 
    }) 
    let thread2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
    dispatch_async(thread2, { 
     while self.isRunning { 
      if !self.isRunning { 
       break 
      } 
     } 
     self.runButton.setTitle("Run", forState: UIControlState.Normal) 
    }) 
} 

Request.execute

func execute() { 
    let session = NSURLSession.sharedSession() 
    let request = NSMutableURLRequest(URL: URL) 
    request.HTTPMethod = self.method 
    request.HTTPBody = self.params.dataUsingEncoding(NSUTF8StringEncoding) 
    self.task = session.dataTaskWithRequest(request) { 
     (data, response, error) in 
     if error == nil { 
      do { 
       . 
       . 
       . 
       .     
       switch self.statusCode { 

       case 200: 
        self.contentsOfURL = try NSString(contentsOfURL: self.URL, encoding: NSUTF8StringEncoding) 
       case 400: 
        print("400: page not found") 

       case 404: 
        print("404: page not found") 

       case 407: 
        print("407: failed authenticate proxy credentials") 

       default: 
        print("unable to get statusCode") 

       } 
      } catch { 
       print(error) 
      } 
      self.isRequesting = false 
     } else { 
      print(error) 
     } 
    } 
     self.task.resume() 
} 
+0

Возможно, попробуйте использовать 'dispatch_async (dispatch_get_main_queue(), ...' для потока 2. –

+1

@ I'L'l Это сработало! Спасибо, если вы отправите его в качестве ответа, я пометю его как ответ. – dbconfession

ответ

0

Так как вы хотите, чтобы ваш окончательный диспетчерский действовать на блок после других депеш попробовать:

void dispatch_async(dispatch_get_main_queue(), dispatch_block_t block); 

Это будет использовать очередную диспетчерскую очередь, связанную с основным потоком приложения, вместо того, чтобы работать в фоновом режиме, как и предыдущий.

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