2016-10-02 4 views
1

에러가 발생하면 서버를 수정 한 후 inoformatsiya 오른쪽 셀에 표시하도록 반환하거나 이전 라인을 반환해야합니다. 또는 데이터를 비동기 적으로 가져올 수 있으며 나중에 셀 결과를 업데이트 할 수 있습니까?서버에 요청을하기 위해 프로그램을 느리게 할 수 있습니까?

버튼의 첫 번째 키를 눌러 서버에서 편집, 두 번째 정보를 저장 할 수 있으며 객체 질문

var tempText:String! 
     @IBAction func editButtonTapped(_ sender:UIButton) { 
      print("editButtonTapped") 
      textIsEditable = !textIsEditable 


      if textIsEditable == true { 
       tempText = questionTextView.text 
       questionTextView.isEditable=true 
       questionTextView.backgroundColor = UIColor.white 
      } else { 
       questionTextView.isEditable=false 
       questionTextView.backgroundColor = UIColor.clear 

       question.questionText=questionTextView.text 

       //Edit question on the server 
       if question.editQuestion() == true { 
        print("return true") 
        if delegate != nil { 
         //delegate.editQuestionAction(question: question) 
         delegate.editQuestionAction(cell: self) 

        } 
       } else { 
        questionTextView.text = tempText 
        question.questionText = tempText 
       } 
      } 

     } 

방법 서버 요청에 대한 질문 클래스 : 요청에 대한

func editQuestion() -> Bool { 
     var edited=false 

     //Prepare image for put 
     let stringImage:String 
     if questionImage == nil { 
      stringImage="" 
     } else { 
      stringImage=imageName 
     } 

     let editDict:[String:String] = ["category" : category, 
         "text" : questionText, 
         "image": stringImage, 
         "id" : questionId] 

     Connection.fetchData(feed: "quests", token: nil, parameters: editDict as [String : AnyObject]?, method: "PUT") { (result, responseDict) in 
      if let success = responseDict?["success"] as? String { 
       if success == "1" { 
        edited = true 
       } else { 
        edited = false 
       } 
      } 
     } 
     return edited 
    } 

방법 서버 :

static func fetchData(feed:String,token:String? = nil,parameters:[String:AnyObject]? = nil,method:String? = nil, onCompletion:@escaping (_ success:Bool,_ data:NSDictionary?)->Void){ 

     DispatchQueue.main.async() { 
      UIApplication.shared.isNetworkActivityIndicatorVisible = true 

      //let url = NSURL(string: feed) 
      if let unwrapped_url = NSURL(string: serverString+feed){ 

       let request = NSMutableURLRequest(url: unwrapped_url as URL) 

       if let tk = token { 
        let authValue = "Token \(tk)" 
        request.setValue(authValue, forHTTPHeaderField: "Authorization") 
       } 

       if let parm = parameters{ 
        do { 
         if let data = try JSONSerialization.data(withJSONObject: parm, options:[]) as NSData? { 

          //println(NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0), error: nil)) 
          request.httpBody = data as Data 
          request.setValue("application/json", forHTTPHeaderField: "Content-Type") 
          request.setValue("\(data.length)", forHTTPHeaderField: "Content-Length") 
         } 
        } catch let error as NSError { 
         print(error) 
        } 
       } 

       if let unwrapped_method = method { 
        request.httpMethod = unwrapped_method 
       } 

       let sessionConfiguration = URLSessionConfiguration.default 
       sessionConfiguration.timeoutIntervalForRequest = 15.0 
       let session = URLSession(configuration: sessionConfiguration) 
       let taskGetCategories = session.dataTask(with: request as URLRequest){ (responseData, response, error) -> Void in 

        let statusCode = (response as! HTTPURLResponse?)?.statusCode 
        print("Status Code: \(statusCode), error: \(error)") 
        if error != nil || (statusCode != 200 && statusCode != 201 && statusCode != 202){ 
         onCompletion(false, nil) 

        } 
        else { 
         do { 
          if let dictionary = try JSONSerialization.jsonObject(with: responseData!, options: [.mutableContainers, .allowFragments]) as? NSDictionary{ 
           onCompletion(true,dictionary) 

          } else{ 
           onCompletion(false, nil) 
          } 
         } catch let error as NSError { 
          print(error) 
         } 
        } 
       } 

       UIApplication.shared.isNetworkActivityIndicatorVisible = false 
       taskGetCategories.resume() 
      } 
     } 
    } 

업데이트 (가져 오기 SwiftHTTP, 필요 ios8) :

func editQuestion(completion:@escaping (Bool)->()) { 
     var edited=false 

     //Prepare image for put 
     let stringImage:String 
     if questionImage == nil { 
      stringImage="" 
     } else { 
      stringImage=imageName 
     } 

     let editDict:[String:String] = ["category" : category, 
         "text" : questionText, 
         "image": stringImage, 
         "id" : questionId] 

     do { 
      let opt = try HTTP.PUT(serverString+"quests", parameters: editDict) 
      opt.start { response in 
       //do things... 
       if let err = response.error { 
        print("error: \(err.localizedDescription)") 
        DispatchQueue.main.async { 
         completion(edited) 
        } 
        return //also notify app of failure as needed 
       } 
       let responseDict=convertStringToDictionary(text: response.text!) 
       if let success = responseDict?["success"] as? String { 
        if success == "1" { 
         edited = true 
         completion(edited) 
        } else { 
         edited = false 
         completion(edited) 
        } 
       } 
      } 
     } catch let error { 
      print("got an error creating the request: \(error)") 
     } 
    } 

이제 좋아?

답변

1

은 기본 스레드에서 원격 요청을하지 마십시오. 그것은 모든 모바일 플랫폼의 규칙이며, 앱은 데이터를 다운로드하거나 업로드 할 때에도 사용자 행동에 대해 책임을 져야합니다.

당신이 원하는 것은 비동기 적으로 사용하는 라이브러리를 사용하여 (Alamofire를 살펴 보는 것이 좋습니다) 콜백을 전달하고 응답은이어야합니다. GCD (dispatch_async)를 사용하여 메인 스레드에서 UI를 업데이트 할 수 있습니다 (적어도 iOS의 다른 스레드에서는 UI를 변경할 수 없습니다).

또한 Apple은 이미 iOS에서 동기 요청을하는 데 사용되지 않는 메소드를 사용하고 있지만 (세마포어 또는 다른 형식의 동기화를 사용하여 수행 할 수도 있음) 유의하십시오.

+0

제발, 내 업데이 트를 확인하십시오. – SeRG1k

+0

나에게 잘 어울린다. 실제로 편집 된 변수가 필요 없다. 나는 단지 완료 (true) 또는 완료 (false)를 호출 하겠지만, 이는 선호 사항의 문제이다. 또한 이와 같은 메소드는 두 개의 콜백을 사용하며, 그 중 하나는 오류가 발생할 때 호출됩니다. 예를 들어 editQuestion 내에서 오류가 발생한 후에 경고를 표시하려면 해당 경고를 열고 적절하게 호출하는 콜백을 전달하십시오. – davidv

+0

나는 당신을 이해한다고 생각합니다. 감사. – SeRG1k