Domanda

Sto aggiungendo circa 3000 mkoverlays alla mia mappa e, come puoi immaginare, ci vuole un po 'di tempo, a volte fino a circa otto secondi. Sto cercando un modo per utilizzare il threading per migliorare le prestazioni, quindi l'utente può spostare la mappa mentre vengono aggiunte le sovrapposizioni. Preferibilmente, le sovrapposizioni verrebbero aggiunte in sequenza, a partire dal Appena quelli all'interno della regione della mappa. Ho provato qualcosa in questo senso con GCD:

- (MKOverlayView*)mapView:(MKMapView*)mapView viewForOverlay:(id)overlay {
    __block MKPolylineView* polyLineView;

    //do the heavy lifting (I presume this is the heavy lifting part, but 
    // because this code doesn't compile, I can't actually *test* it)
    // on a background thread
    dispatch_async(backgroundQueue, ^ { 
        polyLineView = [[[MKPolylineView alloc] initWithPolyline:overlay] autorelease];
        [polyLineView setLineWidth:11.0];

        //if the title is "1", I want a blue line, otherwise red
        if([((LocationAnnotation*)overlay).title intValue]) {
            [polyLineView setStrokeColor:[UIColor blueColor]];
        } else {
            [polyLineView setStrokeColor:[UIColor redColor]];
        }

        //return the overlay on the main thread
        dispatch_async(dispatch_get_main_queue(), ^(MKOverlayView* polyLineView){
            return polyLineView;
        });
    });
}

Ma perché i blocchi GCD sono definiti con void Parametro e tipi di restituzione, questo codice non funziona: ricevo un errore di tipo puntatore incompatibile sul return linea. C'è qualcosa che mi manca qui o un altro modo per infilare questo? O forse un modo completamente diverso per migliorare le prestazioni del processo di aggiunta di sovrapposizioni? Apprezzo ogni aiuto!

Modificare:

Ho scoperto che il problema è non dove in realtà io Inserisci le sovrapposizioni qui:

for(int idx = 1; idx < sizeOverlayLat; idx++) {
    CLLocationCoordinate2D coords[2];
    coords[0].latitude = [[overlayLat objectAtIndex:(idx - 1)] doubleValue];
    coords[0].longitude = [[overlayLong objectAtIndex:(idx - 1)] doubleValue];

    coords[1].latitude = [[overlayLat objectAtIndex:idx] doubleValue];
    coords[1].longitude = [[overlayLong objectAtIndex:idx] doubleValue];

    MKPolyline* line = [MKPolyline polylineWithCoordinates:coords count:2];
    [line setTitle:[overlayColors objectAtIndex:idx]];

    [mapViewGlobal addOverlay:line];
}

L'aggiunta di tutti i 3000 richiede forse 100 ms qui. La parte che richiede molto tempo (presumo) è dove in realtà io creare Le sovrapposizioni, nel primo metodo che ho mostrato.

È stato utile?

Soluzione

C'è un piccolo divario tra ciò che vuoi e ciò che il compilatore può fare. Quando chiami dispatch_async, stai effettivamente dicendo alla CPU "Qui, hai questo pezzo di codice ed eseguilo ogni volta che ne hai voglia, non ora, non bloccare il thread dell'interfaccia utente"Ma, il tuo metodo deve tornare adesso. Semplicemente non c'è modo per creare qualcosa in un thread di sfondo, perché dovrai aspettarlo comunque prima mapView:viewForOverlay: ritorna, poiché deve tornare qualche cosa.

Questo metodo non è il posto dove utilizzare GCD o qualsiasi codice di base. Se il tuo problema è l'aggiunta di un gran numero di sovrapposizioni contemporaneamente, dividerei tutte le sovrapposizioni in blocchi di Say 100 e aggiungo alla mappa con un ritardo di 100 ms tra ogni batch.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top