iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   Continu syncen met database (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/169157-continu-syncen-database.html)

Bbuster 13-11-15 12:00

Continu syncen met database
 
Goede morgen,

Voor een Home Automation App die ik aan het maken ben heb ik een Ipad tegen de muur hangen. Deze staat continu aan en alleen op mijn app.

De app moet continu verbinden met mijn mysql database. Dit doe ik via een php pagina. Elke seconde laad ik gegevens via de php pagina op en aan de hand van de waardes laat ik de app dingen regelen.

Nu is alleen het probleem dat de Ipad niet voldoende bij laadt. Ik heb hem fulltime aan de lader hangen in een dock, maar nog steeds loopt de Ipad sneller leeg dan dat hij bijgeladen wordt.

Als maatregel heb ik al gemaakt als er lange tijd geen beweging is het scherm naar zo donker mogelijk gaat, maar dan nog laadt hij op een hele nacht (+/- 12 uur) maar 15% / 20% bij

Ik zie in de XCode debugger ook dat het laden van de data ervoor zorgt dat hij een extreem hoog energie verbruik heeft.

De data die via php wordt ingeladen is een klein JSON gecodeerd array en de data die de Ipad moet laden is 0,6kb/s en versturen is 0.5kb/s

Is dit op een andere manier op te lossen?

Alvast vriendelijk bedankt!

rsluman 14-11-15 10:31

Welke manier gebruik je om (in je app) te wachten totdat er een seconde is verstreken?

Een goede (energie-zuinige) manier is een NSTimer-object dat je maakt met bijvoorbeeld NSTimer(scheduledTimerWithTimeInterval) in Swift of [NSTimer scheduledTimerWithTimeInterval] in Objective C.

Je stelt de wachttijd in op één seconde en na die seconde wordt je code (die de data inlaadt) dan uitgevoerd. Je kunt ook opgegeven dat dit moet worden herhaald.

Succes!

bitsflew 17-11-15 15:18

Je app moet wel heel veel CPU tijd verbranden als de iPad sneller ontlaadt dan oplaadt!
Kan de gebruikte lader wel de maximale laadstroom van de iPad leveren?

Of is het toch de gebruikte methode?

Zoals rsluman schrijft is NSTimer een mogelijke oplossing.

Maar in dit specieke geval zou ik kiezen voor een aparte thread om de server te pollen.

Voorbeeld (quick en dirty) code:

Simple server polling

Bbuster 19-11-15 19:51

Bedankt voor de antwoorden!

@ bitsflew:
Ik heb jouw code geprobeerd, maar nog steeds is Energy Impact High of Very High. Verder zit er behalve een analoge klok nog niets in de app ingebouwd. Als ik hem uitvoer zonder url connectie is de Energy Impact zero.

bitsflew 19-11-15 23:57

Heb het zelf even geprobeerd (iPad Air)

Met een 32KB json response is de CPU usage < 1%

Energy impact wisselt tussen Very High en High (Average = High)

Desondanks (scherm op 50%) stijgt het accu percentage terwijl de app loopt.

Probleem zit 'm dus niet in de networking/JSON parsing code!

Kun je niet wat meer code posten?

Bbuster 21-11-15 13:25

Bedankt, maar zoals je zelf aangeeft is de energy impact toch ook high of very high?

CPU gebruik blijft bij mij ook laag (+/- 1%). Hoe kan de energie impact alsnog zo hoog zijn met een databestandje van minder dan 50kb?

Thnx!

wubbe 25-11-15 16:34

De echte oplossing is natuurlijk: Niet pollen :)
Je wilt dat de iPad alleen tot actie komt als er iets gewijzigd is.

Er zijn hiervoor diverse mogelijkheden. Google eens op 'serverside push' en 'long pollilng'. Dat is de echte oplossing.

Maar... ik heb ooit ook een App gemaakt waarbij het niet anders kon dan pollen, en die ging toch wel een tijdje mee. Die App polde iedere seconde en daardoor ging de iPhone niet echt dramatisch snel leeg.

(je kunt natuurlijk ook de batterijconditie opvragen en aan de hand daarvan het pol-interval aanpassen)


Alle tijden zijn GMT +2. Het is nu 04:23.