2016-03-21 3 views
0

У меня есть следующий метод в приложении для Android, который я использую для входа/регистрации пользователя.Преобразование Android Volley Запрос на асинхронный запрос iOS NSURL

public void registerUser(final String username, final String email, final String password) { 
    pDialog.setMessage("Signing Up..."); 
    pDialog.show(); 

    request = new StringRequest(Method.POST, SL_URL, new Response.Listener<String>() { 
     @Override 
     public void onResponse(String s) { 
      pDialog.dismiss(); 
      String[] split = s.split("Config.php"); 
      String after = split[1]; 
      try { 
       JSONObject jsonObject = new JSONObject(after); 
       boolean error = jsonObject.getBoolean("error"); 
       if (error) { 
        String errorMsg = jsonObject.getString("error_msg"); 
        Toast.makeText(getApplicationContext(), 
          errorMsg, Toast.LENGTH_LONG).show(); 

       } else { 
        session.setLogin(true, username, email); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }) { 
     @Override 
     protected Map<String, String> getParams() throws AuthFailureError { 
      HashMap<String, String> hashMap = new HashMap<>(); 
      hashMap.put("tag", "login"); 
      hashMap.put("username", name); 
      hashMap.put("password", password); 
      return hashMap; 
     } 
    }; 
    queue.add(request); 
} 

Теперь я пишу свое приложение для iOS и пытаюсь воспроизвести его в Swift. До сих пор у меня есть следующий код:

let username = usernameTxt.text 
     let password = passwordTxt.text 
     let urlPath: String = "***" 
     let url: NSURL = NSURL(string: urlPath)! 
     let request1: NSMutableURLRequest = NSMutableURLRequest(URL: url) 

     request1.HTTPMethod = "POST" 
     let stringPost="tag=login&username=" + username! + "&password=" + password! // Key and Value 
     NSLog(stringPost) 
     let data = stringPost.dataUsingEncoding(NSUTF8StringEncoding) 

     request1.timeoutInterval = 60 
     request1.HTTPBody=data 
     request1.HTTPShouldHandleCookies=false 

     let queue:NSOperationQueue = NSOperationQueue() 

     NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in 
      do { 
       var jsonResult: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary 
      } catch _ {} 

     }) 

Теперь, когда кто-то новое для развития IOS и Swift в целом, у меня есть следующие вопросы:

  1. Что является лучшим способом для репликации progressDialog I использовать в Java в Swift, он должен быть видимым до тех пор, пока запрос не будет завершен, и затем его следует отклонить. Я предполагаю, что это должно быть помещено в completeHandler, однако я не уверен, какой элемент пользовательского интерфейса использовать для диалога прогресса.

  2. Как получить свой ответ как String и воспроизвести поведение функции split, а затем преобразовать результат этого в jsonObject, как в моем Java-коде.

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

спасибо.

ответ

1

Я также разрабатываю приложения для Android и IOS. Здесь я ответил на ваши три Проблемы, с которыми я столкнулся и как новичок. Надеюсь, это поможет вам.

1) Использование MBProgressHUD Link повторить progressDialog в Swift .Есть два метода, чтобы показать и смещать progressDialog:

Использование showLoadingHUD() перед выполнения запроса HTTP

private func showLoadingHUD() { 
    let hud = MBProgressHUD.showHUDAddedTo(self.view, animated: true) 
    hud.labelText = "Loading..." 
} 

И hideLoadingHUD() после получения ответа от сервера

private func hideLoadingHUD() { 
    MBProgressHUD.hideAllHUDsForView(self.view, animated: true) 
} 

2) вы можете использовать Alamofire Link, который может обрабатывать сетевые материалы. И вы можете легко получить ответ в String. Пример:

self.showLoadingHUD() 
       Alamofire.request(.GET, data, parameters: nil) 
        .response { (request, response, data, error) in 
         print(data) // if you want to check data in debug window. 
         let Result = NSString(data: data!, encoding: NSUTF8StringEncoding) 
         Result!.stringByReplacingOccurrencesOfString("\"", withString: "") 
         if(newResult == "1"){ 
          self.navigationController!.popViewControllerAnimated(true) 
          JLToast.makeText("Success").show() 
         } 
         else if (newResult == "0"){ 
          JLToast.makeText("Failed").show() 
         } 

         self.hideLoadingHUD() 

3) mankee ТОА используются для целей отображения информации в течение короткого промежутка времени и исчезают сами. Здесь мы можем использовать Android как Toast, который является JLToast. Доступно на github.

JLToast.makeText("Success").show()