2016-06-03 6 views
0

셀의 단추를 누르면 전체 응용 프로그램이 멈추고 강제로 닫고 다시 시작해야합니다. 앱이 정지되고 디버깅하는 방법을 모르면 콘솔에 아무 것도 표시되지 않습니다. 나 또한 비 사용자 지정 단추를 사용하여 시도했다.버튼을 눌렀을 때 iOS 테이블 뷰가 멈추고 콘솔에서 오류가 발생하지 않습니다.

Before hitting button

Frozen Screen

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
//delete button 

@IBAction func deleteButton(sender: AnyObject) { 

if phonee == "0"{ 
    let URL = "BLURRED FOR PRIVACY" 

    var url : NSString = URL 
    var urlStr : NSString = url.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! 
    var searchURL : NSURL = NSURL(string: urlStr as String)! 
    print (searchURL) 
    let task = NSURLSession.sharedSession().dataTaskWithURL(searchURL, completionHandler: { (data, response, error) -> Void in 
     var urlContent = NSString(data: data!, encoding: NSASCIIStringEncoding) as NSString! 
     print(urlContent) 

     if urlContent.localizedStandardContainsString("Removed event with ID") { 
      dispatch_sync(dispatch_get_main_queue()) { 
      var settings = Modal.Settings() 
      settings.bodyColor = .whiteColor() 
      Modal(title: "Success", body: "Task deleted, refresh the page.", status: .Success, settings: settings).show() 
      } 

      }else{ 
      dispatch_sync(dispatch_get_main_queue()) { 
      var settings = Modal.Settings() 
      settings.bodyColor = .whiteColor() 
      Modal(title: "Error", body: "Are you connected to the internet?", status: .Error, settings: settings).show() 
      } 
     } 
    }) 
    task.resume() 

}else{ 
    dispatch_sync(dispatch_get_main_queue()) { 
    var settings = Modal.Settings() 
    settings.bodyColor = .whiteColor() 
    Modal(title: "Error", body: "You can't delete an accepted task", status: .Error, settings: settings).show() 
    } 
    } 
} 

///////////////////////////////// /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// /////////////////// // 지불 버튼

@IBAction func payButton(sender: AnyObject) { 

    if phonee == "0"{ 

     dispatch_sync(dispatch_get_main_queue()) { 
     var settings = Modal.Settings() 
     settings.bodyColor = .whiteColor() 
     Modal(title: "Error", body: "Please wait for the task to be accepted", status: .Error, settings: settings).show() 
     } 
     }else{ 

     url = url + userID + "&event_id=" + eventID 
     let myURL = NSURL(string: url)! 

     print (myURL) 

     let task = NSURLSession.sharedSession().dataTaskWithURL(myURL, completionHandler: { (data, response, error) -> Void in 
      var urlContent = NSString(data: data!, encoding: NSASCIIStringEncoding) as NSString! 
      print(urlContent) 
     }) 
     task.resume() 

     progressBar.progress = 1.0 
     complete1.textColor = UIColor(red: 43/255.0, green: 192/255.0, blue: 228/255.0, alpha: 1.0) 
     accepted1.textColor = UIColor.blackColor() 

     reportButton.userInteractionEnabled = false 
     deleteButton.userInteractionEnabled = false 
     contactButton.userInteractionEnabled = false 
     payButton.userInteractionEnabled = false 
     priceLabel.textColor = UIColor(red: 170/255, green: 170/255, blue: 170/255, alpha: 1.0) 
     self.deleteButton.backgroundColor = UIColor(red: 170/255, green: 170/255, blue: 170/255, alpha: 1.0) 
     self.contactButton.backgroundColor = UIColor(red: 170/255, green: 170/255, blue: 170/255, alpha: 1.0) 
     self.payButton.backgroundColor = UIColor(red: 170/255, green: 170/255, blue: 170/255, alpha: 1.0) 
     priceLabel.textColor = UIColor(red: 170/255, green: 170/255, blue: 170/255, alpha: 1.0) 
     reportButton.setImage(UIImage(named: "nation2.png"), forState: UIControlState.Normal) 


     } 
} 

/////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////// // 접촉 버튼

@IBAction func contactButton(sender: AnyObject) { 

    if phonee == "0"{ 
     dispatch_sync(dispatch_get_main_queue()) { 
     var settings = Modal.Settings() 
     settings.bodyColor = .whiteColor() 
     Modal(title: "Error", body: "Please wait for the task to be accepted", status: .Error, settings: settings).show() 
     } 
    }else{ 

     if let url = NSURL(string: "tel://\(phonee)") { 
      UIApplication.sharedApplication().openURL(url) 
     } 
    } 
} 
+0

글쎄, 버튼을 눌러 무엇을합니까? 어떤 종류의 코드가 실행됩니까? 더 자세한 정보가 있으십니까? – Acey

+0

버튼을 누르면지도가 열리도록 전화를 걸거나 전화하는 전화 번호 또는 버튼이 아닌 요청을받습니다. 나는 이와 같은 또 다른 견해를 가지고 있으며 이것은 결코 일어나지 않습니다. – user3015221

+0

버튼을 눌렀을 때 실행되는 코드를 표시하지 않거나 버튼의 대상 액션 또는 제스처 인식기가 버튼에 어떻게 추가되는지 보여주지 않으면 누군가 도울 수 있습니다. 관련 코드를 게시하는 것이 좋습니다. – Acey

답변

0

당신은에서 dispatch_sync(dispatch_get_main_queue())를 호출 교착 상태가되는 주 스레드 IBActions는 주 스레드에서 항상 호출되므로 (다른 스레드에서 직접 호출하지 않는 한) 모든 사용자 입력이 주 스레드에서 처리되므로 필요하지 않습니다.

+0

왜 이것이 발생하는지에 대한 더 나은 설명 http://stackoverflow.com/questions/12379059/why-is-this-dispatch-sync-call-freezing – Acey

+0

감사합니다. 대단히, 스레딩이 아직 잘 이해가 안된다. – user3015221

+0

NSURLSession 작업 completionHandler 내의 주 큐로 보내고 디스패치해야한다. 스레딩에서 시작한다면 dispatch_async 대 dispatch_sync를 사용하는 것이 더 안전 할 것입니다. 그런 식으로 교착 상태를 피할 수 있습니다. 'dispatch_async (dispatch_get_main_queue(), ...)를 실행하면 교착 상태가되지는 않지만, 콜백 내에서 UI 업데이트를 수행 할 때뿐 아니라 코드의 다른 모든 영역에 필요하지 않습니다. – Acey