에러가 발생하면 서버를 수정 한 후 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)")
}
}
이제 좋아?
제발, 내 업데이 트를 확인하십시오. – SeRG1k
나에게 잘 어울린다. 실제로 편집 된 변수가 필요 없다. 나는 단지 완료 (true) 또는 완료 (false)를 호출 하겠지만, 이는 선호 사항의 문제이다. 또한 이와 같은 메소드는 두 개의 콜백을 사용하며, 그 중 하나는 오류가 발생할 때 호출됩니다. 예를 들어 editQuestion 내에서 오류가 발생한 후에 경고를 표시하려면 해당 경고를 열고 적절하게 호출하는 콜백을 전달하십시오. – davidv
나는 당신을 이해한다고 생각합니다. 감사. – SeRG1k