我的应用程序是实时跟踪器,其中多个用户登录并通过将他们的坐标发送到我们的Web服务来更新他们的位置,然后每隔2分钟回拨一次,以显示我{{{上的所有用户1}}。
每次我通过MapView
方法从网络服务获取用户的位置时,我正在解析,通过connectionDidFinishLoading
创建polyline
并将其添加到pointsArray
:
overlay
我想要做的是控制为每个用户创建的每个-(void) connectionDidFinishLoading: (NSURLConnection *) connection
{
userLatitudeArray = [[NSMutableArray alloc]init];
userLongitudeArray = [[NSMutableArray alloc]init];
userIdArray = [[NSMutableArray alloc]init];
userNameArray = [[NSMutableArray alloc]init];
userProfilePicArray = [[NSMutableArray alloc]init];
profilePicURLStringArray = [[NSMutableArray alloc]init];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
NSArray *trackingDict = [NSJSONSerialization JSONObjectWithData:empJsonData options:kNilOptions error:nil];
if ([trackingDict count] >= 2) {
for (trackUsersCount = 0; trackUsersCount< trackingDict.count; trackUsersCount++) {
NSLog(@"trackUsersCount %i", trackUsersCount);
NSMutableArray *latlongArray = [[NSMutableArray alloc]init];
latlongArray = [[trackingDict objectAtIndex:trackUsersCount]objectForKey:@"latlong"];
[userLongitudeArray removeAllObjects];
[userLatitudeArray removeAllObjects];
for (int i = 0; i<latlongArray.count; i++) {
[userLatitudeArray addObject:[[latlongArray objectAtIndex:i]objectForKey:@"lat"]];
[userLongitudeArray addObject:[[latlongArray objectAtIndex:i]objectForKey:@"long"]];
}
NSString *name = [[trackingDict objectAtIndex:trackUsersCount]objectForKey:@"user_firstName"];
// ProfilePIC URL
profilePicURLString = [[trackingDict objectAtIndex:trackUsersCount]objectForKey:@"user_profilePicture"];
[userNameArray addObject:name];
[profilePicURLStringArray addObject:profilePicURLString];
int i;
if (userLatitudeArray.count>1) {
for (i = 0; i<userLatitudeArray.count; i++) {
CLLocationCoordinate2D userLocation;
userLocation.latitude = [[userLatitudeArray objectAtIndex:i]doubleValue];
userLocation.longitude = [[userLongitudeArray objectAtIndex:i] doubleValue];
MKMapPoint * pointsArray = malloc(sizeof(CLLocationCoordinate2D)*userLongitudeArray.count);
pointsArray[i] = MKMapPointForCoordinate(userLocation);
polyline = [MKPolyline polylineWithPoints:pointsArray count:i];
free(pointsArray);
}
polyline.title = name;
[mapView addOverlay:polyline];
}
}
}
}
,这样我就可以更改它的颜色并在点击按钮时隐藏/显示它们(一个显示/隐藏我的轨道)和其他所有其他用户),这就是我为它添加标题的原因。
我现在可以看到我将polyline
添加到同一个polyline
,我认为这是错误的。但我不知道Web服务中会有多少用户,因此可以添加多个覆盖。
最初我认为我可以删除带有标题的特定overlay
,但后来我意识到它会删除所有polyline
属性更新。
非常感谢任何帮助!
答案 0 :(得分:1)
您可以收集与其他用户相关的轨道数组,并为当前用户保留单个轨道。如果在connectionDidFinishLoading
函数的开头清理数组并将其填充到当前将叠加层添加到地图的位置,则将addOverlay
移动到最后调用的新函数。
- (void) resetMap
{
if (showOtherTracks)
{
[mapView addOverlays:otherUserTracks];
} else {
[mapView removeOverlays:otherUserTracks];
}
if (showMyTrack)
{
[mapView addOverlay:myTrack];
} else {
[mapView removeOverlay:myTrack];
}
}
您也可以在按下按钮并且状态发生变化时调用此方法。