2013-01-14 65 views
0

我正在構建一個使用Core Location框架跟蹤用戶移動的健身應用程序。 我正在使用Core Data框架保存數據。目前我有兩個實體;鍛鍊和地點。鍛鍊由這些位置對象組成,其中緯度和經度是其主要屬性。從一組NSManagedObject子類創建MKPolyline時的核心數據性能問題

當我試圖從這些Location對象創建MKPolyLine時,它在設備上花費了很多時間。

- (void)createRouteLineAndAddOverLay 
{ 
    CLLocationCoordinate2D coordinateArray[[self.workout.route count]]; 

    for (int i = 0; i < [self.workout.route count]; i++) { 
     CLLocationCoordinate2D coordinate; 
     coordinate.latitude = [[[self.workout.route objectAtIndex:i] latitude] doubleValue]; 
     coordinate.longitude = [[[self.workout.route objectAtIndex:i] longitude] doubleValue]; 
     coordinateArray[i] = coordinate; 
    } 

    self.routeLine = [MKPolyline polylineWithCoordinates:coordinateArray count:[self.workout.route count]]; 
    [self.mapView addOverlay:self.routeLine]; 
    [self setVisibleMapRect]; 
} 

可以使用標量使任何性能改進?或者,我應該在保存時使用某種算法來過濾掉其中的某些位置點?

+0

請NSLog的前後可疑代碼之後。因爲我認爲這不會花費很多時間 –

+0

您每千米跟蹤的座標數量有多少 –

+0

您需要更好地瞭解放緩的位置。 *如果上述方法實際上是問題,它可能是核心數據放慢了速度,或者它可能是'MKPolyline'調用,或者它可能會將覆蓋圖添加到地圖視圖。 –

回答

0

這裏的訣竅是在數據庫端進行排序。

- (void)createRouteLineAndAddOverLay 
{ 
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Location"]; 
    NSSortDescriptor *fromStartToEnd = [NSSortDescriptor sortDescriptorWithKey:@"distance" ascending:YES]; 
    request.sortDescriptors = [NSArray arrayWithObject:fromStartToEnd]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"workout = %@", self.workout]; 
    request.predicate = predicate; 
    NSArray *locations = [self.workout.managedObjectContext executeFetchRequest:request error:NULL]; 

    int routeSize = [locations count]; 

    CLLocationCoordinate2D coordinateArray[routeSize]; 

    for (int i = 0; i < routeSize; i++) { 
     CLLocationCoordinate2D coordinate; 
     coordinate.latitude = [[[locations objectAtIndex:i] latitude] doubleValue]; 
     coordinate.longitude = [[[locations objectAtIndex:i] longitude] doubleValue]; 
     coordinateArray[i] = coordinate; 
    } 

    self.routeLine = [MKPolyline polylineWithCoordinates:coordinateArray count:routeSize]; 
    [self.mapView addOverlay:self.routeLine]; 
    [self setVisibleMapRect]; 
} 

這種方法只用了0.275954秒當鍛鍊了1321個位置

0

下面是一些優化建議:

首先,你必須count+1調用count(> 2000)。將計數存儲在一個變量中。

其次,在您的循環中,您將反覆檢索鍛鍊對象中的數據。嘗試在開始循環之前存儲route數組。

另外,如果route是從WorkoutLocation的多對多關係,則應該導致NSSet而不是數組。我懷疑你正在使用NSOrderdSet,這也可能會影響你的表現。用一個簡單的整數屬性跟蹤訂單可能會更好。

+0

感謝您的回答。不幸的是,你的前兩個建議沒有得到任何明顯的性能改進。是的,我正在使用NSOrderedSet。那麼你是否說我應該將位置保存爲NSSet格式,然後在訪問它們時我會從它創建NSArray並使用此整數屬性對它們進行排序? –

+0

正確,那就是我該怎麼做。此外,從可用性的角度來看,3秒鐘的信息量很大的進度視圖可能是可以接受的。不過,我認爲這應該會更快。 – Mundi

相關問題