2017-01-23 4 views
0

私は10秒後に真を送信するサーバを持っています。 iOSアプリをサーバーから受け取るまで待機するにはどうしたらよいですか? 10秒は一定ではありません、サーバーがどれくらい時間がかかっても、ブール値を取得できるようにアプリケーションが必要です。socket.ioとSwiftを使用してメッセージを待ちます。

私のアプリは水が一定の高さになるまで水を注ぐのに使われ、それが終わったらあなたの電話であなたに通知します。

UPDATE(詳細):

リンクは、私は、次の午前案内する:http://www.appcoda.com/socket-io-chat-app/

func getChatMessage(completionHandler: (messageInfo: [String: AnyObject]) -> Void) { 
    socket.on("newChatMessage") { (dataArray, socketAck) -> Void in 
     var messageDictionary = [String: AnyObject]() 
     messageDictionary["nickname"] = dataArray[0] as! String 
     messageDictionary["message"] = dataArray[1] as! String 
     messageDictionary["date"] = dataArray[2] as! String 

     completionHandler(messageInfo: messageDictionary) 
    } 
} 


override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    SocketIOManager.sharedInstance.getChatMessage { (messageInfo) -> Void in 
     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
      self.chatMessages.append(messageInfo) 
      self.tblChat.reloadData() 
      //    self.scrollToBottom() 
     }) 
    } 
} 

を私は常にサーバーからメッセージを取得しにロードされ、これに非常に似た何かをしたいです景色。ただし、このコードはSwift 3/iOS 10では動作しません。アップデートする方法についてのドキュメントは見つかりません。私は単純にそれを自分のコードに入れてみました。そして、それを試して、それを動作させるために推奨される修正を使ってみましたが、そうしませんでした。

最終的に私のサーバーはPiゼロでホストされ、サーバーから水が適切なレベルに達したというメッセージをPiから受け取る必要があります。 おかげ

+0

1秒ごとに(または0.1秒ごとなど)実行されるタイマーを実行し、アラートを送信してtrueの場合はタイマーを終了できます –

答えて

2

結果:

iOSのソースコード:

あなたは、サーバーに接続したら。

socket.on("connect") { data, ack in 
    self.socket.emit("get-notified-water", "") 
} 

水タンクのレベルについて通知するようにサーバーに指示します。

self.socket.emit("get-notified-water", "") 

そして、あなたはここに通知を聞く:

socket.on("notification-water") { data in 
    let levelTank = data.0.first as! Int 
    self.updateViewWithLevelTank(levelTank) 
} 

注:私はあなたと接続している重要な部分に焦点を当てにしたいので、意図的に私はupdateViewWithLevelTank関数の実装が含まれていませんでした私はそれがUIViewのアニメーションを模倣することは複雑ではないと思うだけでなく、サーバーと水タンクのレベルで通知されています。



サーバーのソースコード:levelTankは匿名関数で100

なるまで

setIntervalは匿名関数を呼び出す、クライアントに通知(iOSソケット)levelTank y時間が呼び出されます。

var app = require('express')(); 
var http = require('http').Server(app); 
var io = require('socket.io')(http); 

var port = 5000; 

io.on('connection', function(socket) { 

    socket.on('get-notified-water', function(data) { 
    var levelTank = 0; 
    var intervalTime = 500; 

    var intervalId = setInterval(function() { 
     levelTank += 10 
     socket.emit('notification-water', levelTank); 

     if (levelTank === 100) { 
     clearInterval(intervalId) 
     } 
    }, intervalTime); 
    }); 

}); 

http.listen(port, function() { 
    console.log('server up and running at %s port', port); 
}); 

だから、おそらく私が知っている何かを見逃している、これはあなたのケースのために働くか、あなたは私の例のいずれかのより多くの明確化が必要な場合は私に知らせてください!;)

関連する問題