2013-02-01 120 views
1

我的應用程序是實時跟蹤器,其中多個用戶登錄並更新他們的位置,通過發送他們的座標到我們的Web服務,然後回調後讓我們每2分鐘顯示我的MapView上的所有用戶。通過網絡服務創建多個MKOverlay來自位置通過網絡服務

每次我從網絡服務的用戶在connectionDidFinishLoading方法的位置,我解析,通過pointsArray創建polyline並將它們添加到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添加到相同的overlay,這是我相信的錯誤。但我不知道有多少用戶會在Web服務中,因此可以添加多個用戶。

最初我以爲我能夠刪除一個特定的polyline與標題,但後來我意識到它正在刪除所有polyline.title屬性得到更新。

任何幫助將不勝感激!

回答

1

您可以收集與其他用戶相關的那些曲目數組,併爲當前用戶保留單曲。如果您在connectionDidFinishLoading函數的開始處清理陣列並將其填充到當前將地圖疊加層添加到的地方,則將addOverlay移動到您在最後調用的新函數中。

- (void) resetMap 
{ 
    if (showOtherTracks) 
    { 
     [mapView addOverlays:otherUserTracks]; 
    } else { 
     [mapView removeOverlays:otherUserTracks]; 
    } 
    if (showMyTrack) 
    { 
     [mapView addOverlay:myTrack]; 
    } else { 
     [mapView removeOverlay:myTrack]; 
    } 
} 

你也可以在按下按鈕並且狀態改變時調用它。

+0

謝謝我明白了,但這裏的問題是,如果我想控制每個用戶的多段線顏色,我將無法做到這一點,除非我爲每個用戶添加單獨的疊加層,對嗎? – Samapple007

+0

正確,這就是爲什麼otherUserTracks是一系列的ploylines。然後在viewForOverlay中,您需要確定哪個是哪個,然後相應地着色它們。 – Craig

+0

是否可以控制數組中每條多段線的顏色,但是在同一個疊加層中?請提供一些示例,因爲我很困惑如何在其他用戶軌跡中顯示不同顏色的多條多段線時如何執行此操作? – Samapple007