Swift - Setting room variable

Post here your questions about the Objective-C API for SFS2X

Moderators: Lapo, Bax

intomo
Posts: 28
Joined: 22 Nov 2010, 21:21
Location: Los Angeles

Swift - Setting room variable

Postby intomo » 10 May 2019, 04:35

I'm having trouble setting roomVariables in Swift

Code: Select all

let updatedVar = SFSRoomVariable(name: "lastCommand", value: "myString")
        smartFox.send(SetRoomVariablesRequest.request(withRoomVariables: updatedVar) as? IRequest)


Errors are, first line, it's saying a need a third parameter. The docs indicate that this is optional.
Second line, Cannot convert value of type 'SFSRoomVariable' to expected argument type '[Any]?'

Thanks very much for your help in advance.
User avatar
Lapo
Site Admin
Posts: 20723
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Swift - Setting room variable

Postby Lapo » 10 May 2019, 07:22

Hi,
it looks like in Swift the optional params from Objective-C are not that optional :)

In order to make this work you should do the following:

1) In the bridging header file add an extra import:

Code: Select all

#import <SFS2XAPIIOS/VariableType.h>


2) Build the variable with the extra parameter:

Code: Select all

let updateVar = SFSRoomVariable(name: "VarName", value: "VarValue", type: VariableType_STRING);


Via auto-completion you can find all the VariableType_XYZ available.
Hope it helps
Lapo
--
gotoAndPlay()
...addicted to flash games
User avatar
Lapo
Site Admin
Posts: 20723
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Swift - Setting room variable

Postby Lapo » 10 May 2019, 07:24

For the sake of completeness the full code should look like this:

Code: Select all

let updateVar = SFSRoomVariable(name: "VarName", value: "VarValue", type: VariableType_STRING);
sfs!.send(updateVar as! IRequest!);


Cheers
Lapo

--

gotoAndPlay()

...addicted to flash games
intomo
Posts: 28
Joined: 22 Nov 2010, 21:21
Location: Los Angeles

Re: Swift - Setting room variable

Postby intomo » 10 May 2019, 16:13

Thank you. That helped with the compiling.
This is my revised code. Still having trouble.

Code: Select all

let updateVar = SFSRoomVariable(name: "strobeOn", value: true, type: VariableType_BOOL);
        smartFox.send(updateVar as? IRequest);


The Room Variable strobeOn is a persistent room variable set up in the admin tool as false. When I send this command it doesn't change in the admin tool and I don't get a onRoomVariablesUpdate event triggered.
User avatar
Lapo
Site Admin
Posts: 20723
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Swift - Setting room variable

Postby Lapo » 10 May 2019, 16:47

Do you see errors on client or server side?
Are you setting the RoomVariable after having joined a Room?

Thanks
Lapo

--

gotoAndPlay()

...addicted to flash games
intomo
Posts: 28
Joined: 22 Nov 2010, 21:21
Location: Los Angeles

Re: Swift - Setting room variable

Postby intomo » 10 May 2019, 17:16

Here's what happens when I send the RoomVariable with the above code:

com.smartfoxserver.v2.protocol.binary.BinaryIoHandler.validateIncomingDataSize(BinaryIoHandler.java:511)
com.smartfoxserver.v2.protocol.binary.BinaryIoHandler.handleDataSize(BinaryIoHandler.java:295)
com.smartfoxserver.v2.protocol.binary.BinaryIoHandler.handleRead(BinaryIoHandler.java:183)
com.smartfoxserver.v2.protocol.SFSIoHandler.onDataRead(SFSIoHandler.java:143)
com.smartfoxserver.bitswarm.core.SocketReader.readTcpData(SocketReader.java:336)
com.smartfoxserver.bitswarm.core.SocketReader.readIncomingSocketData(SocketReader.java:220)
com.smartfoxserver.bitswarm.core.SocketReader.run(SocketReader.java:171)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)
intomo
Posts: 28
Joined: 22 Nov 2010, 21:21
Location: Los Angeles

Re: Swift - Setting room variable

Postby intomo » 10 May 2019, 22:21

intomo wrote:Here's what happens when I send the RoomVariable with the above code:

com.smartfoxserver.v2.protocol.binary.BinaryIoHandler.validateIncomingDataSize(BinaryIoHandler.java:511)
com.smartfoxserver.v2.protocol.binary.BinaryIoHandler.handleDataSize(BinaryIoHandler.java:295)
com.smartfoxserver.v2.protocol.binary.BinaryIoHandler.handleRead(BinaryIoHandler.java:183)
com.smartfoxserver.v2.protocol.SFSIoHandler.onDataRead(SFSIoHandler.java:143)
com.smartfoxserver.bitswarm.core.SocketReader.readTcpData(SocketReader.java:336)
com.smartfoxserver.bitswarm.core.SocketReader.readIncomingSocketData(SocketReader.java:220)
com.smartfoxserver.bitswarm.core.SocketReader.run(SocketReader.java:171)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)


The variables are persistent and set in the Admin tool.
No errors on client.
User avatar
Lapo
Site Admin
Posts: 20723
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Swift - Setting room variable

Postby Lapo » 11 May 2019, 15:55

Sorry, I made a mistake in my previous post. I was sending the Room Variable without wrapping it in a SetRoomVariableRequest, silly me! :D

Example:

Code: Select all

func onRoomJoin(_ evt: SFSEvent!)
    {
        let room = evt.params["room"] as! Room;
        let updateVar = SFSRoomVariable(name: "MyName", value: "MyValue", type: VariableType_STRING);
        sfs!.send(SetRoomVariablesRequest(roomVariables: [updateVar], room: room));
    }
   

Hope it helps
Lapo

--

gotoAndPlay()

...addicted to flash games
intomo
Posts: 28
Joined: 22 Nov 2010, 21:21
Location: Los Angeles

Re: Swift - Setting room variable

Postby intomo » 12 May 2019, 01:00

Thanks Lapo! Both of these seem to work. But Swift is asking me to cast updateVar as Any.

Code: Select all

 let updateVar = SFSRoomVariable(name: "strobeOn", value: true, type: VariableType_BOOL);
        //smartFox.send(SetRoomVariablesRequest(roomVariables: [updateVar as Any], room: room ))
        smartFox.send(SetRoomVariablesRequest.request(withRoomVariables: [updateVar as Any]) as? IRequest)
User avatar
Lapo
Site Admin
Posts: 20723
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Swift - Setting room variable

Postby Lapo » 13 May 2019, 07:20

Interesting, I did not see that in my environment. Maybe we're using different versions of XCode. I am still using version 8.x

Cheers
Lapo

--

gotoAndPlay()

...addicted to flash games
intomo
Posts: 28
Joined: 22 Nov 2010, 21:21
Location: Los Angeles

Re: Swift - Setting room variable

Postby intomo » 15 May 2019, 19:20

I'm using Xcode 10.2, iOS 12, Swift 5.
Thanks again for all your help!

Next question:
How many room variables is too many?
I'm trying to save the game state so that if a user joins late they are in sync with everyone else.
What I think I'd love to do is just save a state object instead of individual persistent room vars.
Basically saving this struct

Code: Select all

struct LastState {
    var color: Bool = false
    var video: Bool = false
    var image: Bool = false
    var strobe: Bool = false
    var blink: Bool = false
    var clear: Bool = false
    var pulse: Bool = false
    var vidInd: Int = 0
    var imgInd: Int = 0
    var clrInd: Int = 0
   
    init(color: Bool = false, video: Bool = false, strobe: Bool = false, blink: Bool = false, clear: Bool = false, pulse: Bool = false, vidInd: Int = 0, imgInd: Int = 0, clrInd: Int = 0) {
        self.strobe = strobe
        self.blink = blink
        self.clear = clear
        self.pulse = pulse
        self.vidInd = vidInd
        self.imgInd = imgInd
        self.clrInd = clrInd
    }
}


Can I save the struct with VariableType_Object?
I tried that and it wanted an SFSObject.
Also can I save multiple variables in 1 call? Currently doing this to save 2.

Code: Select all

 let var1 = SFSRoomVariable(name:"color", value: true, type: VariableType_STRING);
        smartFox.send(SetRoomVariablesRequest(roomVariables: [var1 as Any], room: room ))
        let var2 = SFSRoomVariable(name:"clrInd", value: color, type: VariableType_INT);
        smartFox.send(SetRoomVariablesRequest(roomVariables: [var2 as Any], room: room ))
User avatar
Lapo
Site Admin
Posts: 20723
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Swift - Setting room variable

Postby Lapo » 16 May 2019, 07:03

intomo wrote:How many room variables is too many?

There isn't a set limit. It depends on many parameters:
- how ofter they are updated
- content of the variables (simple numeric values vs long strings or nested objects)
- game client (mobile vs desktop)

The most important aspect is how many of these variables are updated and how often. If you find yourself updating 20+ variables every few hundred milliseconds you might need to rethink your strategy.

Even in that case you should probably check with a network monitor to see how much bandwidth a single client requires.

I'm trying to save the game state so that if a user joins late they are in sync with everyone else.
What I think I'd love to do is just save a state object instead of individual persistent room vars.

The separate variable approach would be fine unless these values are changed super fast multiple times a second.

Can I save the struct with VariableType_Object?

No, but you could wrap those values in a single SFSObject which would then act as a single Room Variable.
The problem with this approach, however, is that every time you need to change one of the values of the SFSObject you would re-transmit the whole object to everyone.

I would probably opt for the separate values unless, again, these values are all updating super-fast.

Hope it helps
Lapo

--

gotoAndPlay()

...addicted to flash games

Return to “SFS2X iPhone / iPad / OSX API”

Who is online

Users browsing this forum: No registered users and 2 guests