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/)
-   -   MKReverseGeocoder werkt niet op GPRS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/61722-mkreversegeocoder-werkt-niet-op-gprs.html)

Jelle Ages 16-06-10 19:01

MKReverseGeocoder werkt niet op GPRS
 
In mijn iPhone-app maak ik gebruik van een MKReverseGeocoder om de plaatsnaam op te halen. Dit doe ik via een void die ik heb gekoppeld aan een NSTimer die elke seconde blijft herhalen.
Helaas kom ik er bij het testen achter dat de MKReverseGeocoder het niet doet via GPRS. Zou iemand mij kunnen vertellen of dit normaal is en wat ik er aan kan doen om dit op te lossen?

Groet,

Jelle

Whacko 17-06-10 11:04

Zou moeten werken, maar mischien is het wel zo dat het ophalen van de data over GPRS langer duurt dan de 1 seconde van je timer. Sowieso lijkt het me niet echt netjes om dit met een timer te doen.
Daarnaast MAG het ook niet eens van apple om dit elke seconde te doen (uit de api documentatie):
Each Map Kit application has a limited amount of reverse geocoding capacity, so it is to your advantage to use reverse geocode requests sparingly. Here are some rules of thumb for using this class most effectively:
  • Send at most one reverse-geocoding request for any one user action.
  • If the user performs multiple actions that involve reverse-geocoding the same location, reuse the results from the initial reverse-geocoding request instead of starting individual requests for each action.
  • When you want to update the location automatically (such as when the user is moving), reissue the reverse-geocoding request only when the user's location has moved a significant distance and after a reasonable amount of time has passed. For example, in a typical situation, you should not send more than one reverse-geocode request per minute.
  • Do not start a reverse-geocoding request at a time when the user will not see the results immediately. For example, do not start a request if your application recently resigned the active state (possibly because of an interruption such as a phone call) and is waiting to become active again.
Je moet gewoon CLLocationManager gebruiken, en de delegate methods implementeren, dan krijg je elke keer als je locatie verandert een seintje. En wanneer het ECHT nodig is om de adresgegevens op te halen, dan kan je de MKReverseGeocoder aanroepen.

Jelle Ages 17-06-10 18:26

Bedankt voor de informatie.

Ik moet dus CLLocationManager gebruiken. Is er dan 1 -(void) die mij vertelt wanneer de UserLocation bekend is?
Zo ja, wil iemand die mij geven?

(Btw: ik heb zelf al uitgebreid gegoogled.)

EDIT!: Je had gelijk, op GPRS heeft de app simpelweg meer tijd nodig om plaatsnaam te vinden. Zou Apple het wel goedkeuren als ik een timer met een interval van 5 seconden gebruik?

wubbe 18-06-10 10:16

Citaat:

Oorspronkelijk geplaatst door Jelle Ages (Bericht 466403)
Je had gelijk, op GPRS heeft de app simpelweg meer tijd nodig om plaatsnaam te vinden. Zou Apple het wel goedkeuren als ik een timer met een interval van 5 seconden gebruik?

Waarom blijf je aan deze oplossing (die geen oplossing is) vasthouden? Dit is gewoon een verkeerde implementatie.
Bedenk eens goed waarom je in hemelsnaam iedere seconde of iedere 5 seconden de plaatsnaam wil opvragen. Reis je met een straaljager of zo?

Ga voor de echte oplossing en bekijk de delegate methods van CLLocationManager eens goed. Niet Googlen dus, maar de API goed lezen.

Kijk bijvoorbeeld eens naar (toch googlen)
Code:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation;

Whacko 18-06-10 13:19

Apple heeft ook een leuk voorbeeld projectje:
LocateMe:
https://developer.apple.com/iphone/l...ion/Intro.html

Jelle Ages 19-06-10 14:34

Dank voor advies.

Ik heb nu in de documentatie het volgende gevonden:

Code:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
Het lijkt me dat dit goed bruikbaar is voor mij. Helaas krijg ik een hoop warnings als ik hem implementeer in mijn project. Dit komt omdat ik in het void een MKReverseGeocoder gebruik. Hiervoor heb ik ook info van de mapview nodig. Hij geeft dan aan: 'Local declaration of 'mapView' hides instance variable'.
Ik denk dat dit komt omdat ik in de *.h file van de viewController een MKMapView aanmaak.

Iemand een oplossing hoe ik dit oplos?

Jelle Ages 19-06-10 21:45

Als ik trouwens nog even terug mag komen op je eerste post in dit topic: het gaat mij er niet om dat er telkens wordt gecontroleerd of de locatie is veranderd, maar alleen om de locatie van het moment wanneer de app opstart. Ik doe dit via een timer, die gekoppeld is aan een void die een ReverseGeocoder aanzet. Wanneer deze zijn taak voltooid heeft, laat ik de timer stoppen.

Dit zal Apple toch wel goedkeuren?

wubbe 19-06-10 22:42

Apple kijkt volgens mij naar andere zaken.
Ik snap echter nog steeds niet waarom je een timer nodig hebt. Een paar postings terug heb je het over een interval van 5 seconden, en nu wil je eenmalig de locatie weten.

Lees eens goed in de documentatie wat een delegate is. Als je dat begrijpt zul je zien dat je geen timer nodig hebt.

Jelle Ages 19-06-10 23:38

Ik heb een timer nodig omdat de app na het opstarten moet kijken in welke plaats de gebruiker zich bevindt. Als dit na vijf seconden niet gelukt is (slechte gps- en/of internetverbinding bijvoorbeeld) moet hij het over vijf seconden nog een keer proberen, tot het wel gelukt is.

Ik weet nu wat een delegate is. Als ik me niet vergis is dit ook een delegate:

Code:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
Ik weet alleen niet hoe ik 'm moet gebruiken.

Jelle

wubbe 19-06-10 23:50

Citaat:

Oorspronkelijk geplaatst door Jelle Ages (Bericht 467473)
Ik weet nu wat een delegate is.

Dat betwijfel ik.
Een delegate vertelt jou als hij een plaatsbepaling heeft gedaan, in plaats van dat je het hem moet vragen. Daarom heb je helemaal geen timer nodig.

Het Locate Me voorbeeld laat dat allemaal zien. Ik zou dat eens goed bekijken.

Jelle Ages 20-06-10 00:07

Ja, maar die plaatsbepaling doe ik via een MKMapView en daar zie ik niks over in LocateMe. Ik heb een timer nodig omdat het void dat de ReverseGeocoder regelt, het meerdere keren moet proberen omdat in het begin de userLocation op de mapview nog niet bekend is.
Aan een LocationManger heb ik dus niks, omdat ik afhankelijk ben van de MapView.

Matisse 20-06-10 20:57

Citaat:

Oorspronkelijk geplaatst door Jelle Ages (Bericht 467480)
Ik heb een timer nodig omdat het void dat de ReverseGeocoder regelt...

Ik zie je de hele tijd spreken over "het void". Wat bedoel je daar eigenlijk mee??

Jelle Ages 20-06-10 21:43

Er staat achter: 'dat de ReverseGeocoder regelt'. Dit slaat op 'het void'. Ik bedoel dus met 'het void dat de ReverseGeocoder regelt' een -(void) { } waarin staat dat er een MKReverseGeocoder geactiveerd moet worden.

Matisse 20-06-10 22:30

Het is mierenneukerij maar je kan het beter gewoon "de methode" noemen ;)

Er zijn nog wel een paar momenten dat je een verkeerde definitie gebruikt... een delegate is geen functie, zoals jij aangeeft, maar een klasse die een bepaald protocol ondersteunt en daarvoor een implementatie van een functie of methode voorziet.


Alle tijden zijn GMT +2. Het is nu 13:10.