Une méthode pour effectuer les requêtes HTTP sur l'Unité iOS?

J'ai besoin d'envoyer des requêtes HTTP avec toutes les méthodes RESTful et l'accès au corps de la requête pour envoyer/recevoir JSON avec elle. J'ai regardé dans,

WebRequest.HttpWebRequest

Cela fonctionne presque parfaitement, mais il y a des cas où, par exemple, si le serveur est en bas de la fonction GetResponse peut prendre de quelques secondes à revenir, puisque c'est une méthode synchrone - le gel de l'application de cette période. La version asynchrone de cette méthode, BeginGetResponse, ne semble pas fonctionner de manière asynchrone (dans l'Unité de toute façon) car il gèle encore la demande pour cette période.

UnityEngine.WWW#

Prend uniquement en charge POST et GET demandes pour une raison quelconque - mais j'ai aussi besoin de PUT et DELETE (standard Reposant méthodes) donc je n'ai pas pris la peine de les examiner plus avant.

Système.Filetage

Pour exécuter WebRequest.HttpWebRequest.GetResponse sans geler l'application j'ai regardé dans l'aide de threads. Fils semblent travailler dans l'éditeur (mais semble extrêmement volatiles, si vous ne cessez pas d'un fil lorsque l'application se ferme qu'il continue de fonctionner dans l'éditeur pour toujours, même quand vous l'arrêter), et lors de la construction d'un appareil iOS crash dès que je tente de démarrer un thread (j'ai oublié d'écrire l'erreur et je n'ai pas accès pour l'instant).

Exécuter les threads dans un natif de l'application pour iOS avec un pont à l'Unité d'application

Ridicule, même pas d'aller à cette tentative.

UniWeb

Cette. Je voudrais savoir comment ils ont géré la.

Voici un exemple de la WebRequest.BeginGetResponse méthode que je suis en train d'essayer,

//The RequestState class passes data across async calls.
public class RequestState
{
   const int BufferSize = 1024;
   public StringBuilder RequestData;
   public byte[] BufferRead;
   public WebRequest Request;
   public Stream ResponseStream;
   //Create Decoder for appropriate enconding type.
   public Decoder StreamDecode = Encoding.UTF8.GetDecoder();

   public RequestState()
   {
      BufferRead = new byte[BufferSize];
      RequestData = new StringBuilder(String.Empty);
      Request = null;
      ResponseStream = null;
   }     
}

public class WebRequester
{
    private void ExecuteRequest()
    {
        RequestState requestState = new RequestState();
        WebRequest request = WebRequest.Create("mysite");
        request.BeginGetResponse(new AsyncCallback(Callback), requestState);
    }

    private void Callback(IAsyncResult ar)
    {
      //Get the RequestState object from the async result.
      RequestState rs = (RequestState) ar.AsyncState;

      //Get the WebRequest from RequestState.
      WebRequest req = rs.Request;

      //Call EndGetResponse, which produces the WebResponse object
      // that came from the request issued above.
      WebResponse resp = req.EndGetResponse(ar);
    }
}

... sur cette base: http://msdn.microsoft.com/en-us/library/86wf6409(v=vs. 71).aspx

  • S'il vous plaît montrer un exemple de la façon dont vous utilisez BeginGetResponse... peut être un problème avec votre code de trop (administration de commentaires, vous ne savez pas si l'Unité a un comportement spécial pour cet appel).
  • Exemple ajouté. L'unité utilise une version personnalisée de Mono 2.6 je crois.
  • Hé, monsieur, votre question est clairement assez confus et ne fait que répondre par vous-même, mais je me pose exactement la même question avec l'unité et de requêtes http. Au lieu de threads, je suis en train coroutines. Je ne pense pas que le thread est le meilleur chemin, mais je ne pouvais toujours pas tout à fait avec les coroutines. Avez-vous des mises à jour sur ce point? Avez-vous essayé de faire de mon chemin? Pouvez-vous partager votre solution?
  • Lorsqu'utilisé dans une coroutine la délinquance méthode encore gèle l'application jusqu'à ce qu'il retourne - ma théorie est que la méthode bloque le thread qu'il est appelé. Je ne pense pas que coroutines impliquent de thread pour rien appelé en eux est exécuté sur le thread principal de toute façon, le gel de l'application comme si vous l'avez appelé n'importe où ailleurs. L'appel de la méthode dans un thread a bien fonctionné, juste être très prudent pour fermer manuellement votre fils comme unité/mono ne semble pas le faire automatiquement.
  • Vous avez répondu assez vite @Ford, mais pour une raison que je n'ai pas reçu la notification. J'ai eu beaucoup de succès à l'aide de coroutines pour les processus en parallèle avec WWW et LoadLevelAsync, j'ai donc pensé qu'il pourrait être possible là aussi. Mais maintenant, j'ai confiance, comme vous l'avez dit, il ne fait pas de créer son propre thread en effet, il s'agit en fait simplement faire des appels asynchrones dans le même thread... de toute façon, si vous avez obtenu ce compris, pourriez-vous partager votre solution avec nous? Ou est-il plus de 3 pages de large, comme votre msdn lien?
  • Coroutines fonctionnent toujours sur le même thread que celui qui les a appelés. Donc, si le code de votre coroutine est le blocage, il permet de bloquer votre application. LoadLevelAsync travaux, par exemple, parce que c'est une méthode asynchrone. Coroutines travail de sauvegarder leur pile d'appel au moment où vous le rendement d'eux. Lorsque vous revenez dans votre coroutine méthode, il reprend l'exécution à l'endroit exact où vous l'avez laissé, le maintien de tous les locaux de la pile de l'état qu'il avait lorsqu'il a donné. Mais il est toujours sur le même thread. C'est comme contrôlée par l'utilisateur de la planification des threads. C'est très différent de réel système de threads.
  • Ne les blâme pas .Net threads pour votre incapacité à lire le manuel... Threads ont un IsBackground de la propriété que vous pouvez définir avant de les commencer. Si elle est définie sur True, le thread va mourir lors de l'application. La valeur par défaut est False.

InformationsquelleAutor fordeka | 2012-09-01