14

Zrobiłem aplikację na iPhone'a. Teraz odtwarzam go na iPada.UIActivityViewController potrzebuje dużo czasu, aby zaprezentować

Gdy użytkownik wybierze przycisk akcji na pasku narzędzi, popover powinien pokazać się z numerem UIActivityViewController, ale z jakiegoś powodu wyświetlenie go po raz pierwszy zajmuje około 10 sekund. Na iPhonie zajmuje to około sekundy. To ten sam kod, poza popover.

Próbowałem wyłączyć popover, ale nadal trwa to około 10 sekund, aby pokazać.

Oto kod:

-(IBAction)Actions:(UIBarButtonItem*)sender 
{ 
    if ([activityPopover isPopoverVisible] == YES) 
    { 
     [activityPopover dismissPopoverAnimated:YES]; 
     return; 
    } 
    UIWebView *currentWebView = ((TabView *)self.tabs[self.currentTabIndex]).webViewObject; 

    NSString *currentURL = (NSString*)[currentWebView request].mainDocumentURL; 
    if (currentURL == NULL) return; 

    BookmarkActivity *bookmarkActivity = [[BookmarkActivity alloc] init]; 

    UIActivityViewController *sharing = [[UIActivityViewController alloc] initWithActivityItems:[NSArray arrayWithObject:currentURL] applicationActivities:@[bookmarkActivity]]; 

    activityPopover = [[UIPopoverController alloc] initWithContentViewController:sharing]; 
    [activityPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];  
} 

Ja testowałem na moim iPadzie 3 i mój iPad mini, zarówno zająć trochę czasu, aby przedstawić ten.

Jak mogę rozwiązać problem?

+0

Czy testowałem to z czasowym profilera? Możesz odkryć, jakie są instrukcje, które trwają przez większość czasu. –

+0

Nie, jak to zrobić? – Maximilian

+0

Wciśnij cmd + I następnie wybierz profiler czasu. Poczekaj 10-20 sekund. Następnie zaznacz opcję "ukryj biblioteki systemowe". Pozwoli ci to zobaczyć lepszą metodę w stosie wywołań.Znajdź swoją metodę w stosie wywołań i kliknij dwa razy na nim, zobaczysz zużycie czasu. –

Odpowiedz

18

Dobre pytanie, po prostu miałem ten sam problem. Tak naprawdę nie da się go rozwiązać. Można jednak poprawić doświadczenia użytkownika, tworząc wskaźnik aktywności, a następnie wysyłając inicjalizacji UIActivityViewController do tła:

-(void)openIn:(id)sender 
{ 
    // start activity indicator 
    [self.activityIndicator startAnimating]; 

    // create new dispatch queue in background 
    dispatch_queue_t queue = dispatch_queue_create("openActivityIndicatorQueue", NULL); 

    // send initialization of UIActivityViewController in background 
    dispatch_async(queue, ^{ 
     NSArray *dataToShare = @[@"MyData"]; 
     UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:dataToShare applicationActivities:nil]; 

     // when UIActivityViewController is finally initialized, 
     // hide indicator and present it on main thread 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.activityIndicator stopAnimating]; 
      [self presentViewController:activityViewController animated:YES completion:nil]; 
     }); 
    }); 
} 

To działa jak czar. Gdy użytkownik dotknie przycisku, wskaźnik aktywności zacznie się animować, co wskazuje, że proces ten zajmie trochę czasu.

+2

Proponuję to samo, ale w bardziej elegancki sposób. Ustaw właściwość 'customView'' UIBarButtonItem' na 'UIActivityIndicator' utworzony w locie. Spowoduje to zastąpienie ikony przycisku wskaźnikiem aktywności. Następnie, w bloku wypełniania animacji prezentacji, wywołaj '[przycisk setCustomView: nil]' i powróci do oryginalnego stylu. =) –

+0

@BrunoPhilipe Na iOS 7.0.3 Wywołanie 'setCustomView: nil' na UIBarButtonItem utworzonym z ikoną systemu pojawia się, aby całkowicie usunąć ikonę. – zekel

+0

@zeckel robię w aplikacji z iOS 7.1 beta i działa poprawnie. Może to coś innego? Jeśli twój przycisk używał niestandardowego widoku przed wykonaniem wymiany, musisz go zamiast tego zamienić zamiast "zer". Spróbuj sprawdzić poprzednią wartość 'customView'. –

13

Miałem ten sam problem na iOS 7. Kiedy usunąłem UIActivityTypeAirDrop z dozwolonych rodzajów aktywności, kontroler pojawia się niemal natychmiast.

+0

To dziwne i smutne, że Apple nie może zrobić tego szybko: O dzięki! – Maximilian

+5

Jest szybszy niż wcześniej, ale wciąż jest wolny – Gabox

+3

Odpowiedni kod: UIActivityViewController * activityController = [[przydział UIActivityViewController] initWithActivityItems: sharingItems applicationActivities: nil]; activityController.excludedActivityTypes = @ [UIActivityTypeAirDrop]; – Beninho85

5

Mimo, że te rozmowy są już od głównego wątku, ponieważ iOS 7, owijając niektóre z tych połączeń prezentacji w bloku wysyłkowy wydaje się znacznie zmniejszyć opóźnienia

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self presentViewController:activityViewController animated:YES completion:nil]; 
}); 
+0

Czy to zmierzyłeś? Nie mogę zrozumieć, jak to powinno działać, ponieważ po prostu uruchamia prezentację w następnej iteracji pętli głównej, czyli w rzeczywistości późniejszej niż w przypadku bezpośredniego wywołania. * zdziwiony * – DrMickeyLauer

Powiązane problemy