14

Ich habe eine App für iPhone. Jetzt erstelle ich es für iPad neu.UIActivityViewController dauert lange Zeit zu präsentieren

Wenn der Benutzer die Aktionsschaltfläche in der Symbolleiste auswählt, sollte ein Popover mit einer UIActivityViewController angezeigt werden, aber aus irgendeinem Grund dauert es ungefähr 10 Sekunden, bis es das erste Mal angezeigt wird. Auf dem iPhone dauert es ungefähr eine Sekunde. Es ist derselbe Code außer dem Popover.

Ich habe versucht, das Popover zu deaktivieren, aber es dauert immer noch etwa 10 Sekunden zu zeigen. Hier

ist der Code:

-(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];  
} 

ich auf meinem iPad getestet haben 3 und mein iPad mini, die beide eine Weile dauern, diese zu präsentieren.

Wie kann ich das Problem lösen?

+0

Haben Sie es mit Zeit-Profiler getestet? Sie können feststellen, welche Anweisungen die meiste Zeit benötigen. –

+0

Nein, wie mache ich das? – Maximilian

+0

Drücken Sie cmd + I und wählen Sie dann time profile.Wait für 10-20 Sekunden. Wählen Sie dann die Option "Systembibliotheken ausblenden". Dadurch können Sie Ihre Methode im Call-Stack besser sehen.Finden Sie Ihre Methode in der Aufrufliste und klicken Sie auf zwei mal darauf sehen Sie den Zeitverbrauch. –

Antwort

18

Gute Frage, ich hatte gerade das gleiche Problem. Es ist nicht wirklich lösbar. Sie können jedoch die Benutzererfahrung durch die Schaffung eine Aktivitätsanzeige verbessern und dann die Initialisierung des UIActivityViewController in den Hintergrund zu senden:

-(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]; 
     }); 
    }); 
} 

Es funktioniert wie ein Charme. Wenn der Benutzer die Schaltfläche berührt, beginnt die Aktivitätsanzeige zu animieren, was darauf hinweist, dass der Vorgang eine Weile dauern wird.

+2

Ich schlage dasselbe vor, aber auf eine elegantere Weise. Setzen Sie die 'UIBarButtonItem' -Eigenschaft' customView' auf einen 'UIActivityIndicator', der im laufenden Betrieb erstellt wird. Dies ersetzt das Schaltflächensymbol zum Aktivitätsindikator. Dann rufen Sie im Completion Block der Präsentationsanimation '[button setCustomView: nil]' auf und kehren zum ursprünglichen Stil zurück. =) –

+0

@BrunoPhilipe Unter iOS 7.0.3 Durch Aufruf von 'setCustomView: nil' in einem UIBarButtonItem, das mit einem Systemsymbol erstellt wurde, wird das Symbol vollständig entfernt. – zekel

+0

@zöckel Ich mache gerade eine App mit iOS 7.1 Beta und es funktioniert einwandfrei. Vielleicht ist es etwas anderes? Wenn Ihre Schaltfläche vor dem Ersetzen eine benutzerdefinierte Ansicht verwendet hat, müssen Sie sie stattdessen ersetzen, anstatt sie auf "null" zu setzen. Überprüfe den vorherigen Wert von 'customView'. –

13

Ich hatte das gleiche Problem auf iOS 7. Wenn ich UIActivityTypeAirDrop aus den zulässigen Aktivitäten Typen entfernt, jedoch erscheint der Controller fast sofort.

+0

Das ist seltsam und traurig, dass Apple das nicht so schnell machen kann: O Danke! – Maximilian

+5

Es ist schneller als vorher, aber es ist immer noch langsam – Gabox

+3

Entsprechender Code: UIActivityViewController * activityController = [[UIActivityViewController Alloc] initWithActivityItems: sharingItems applicationActivities: nil]; activityController.excludedActivityTypes = @ [UIActivityTypeAirDrop]; – Beninho85

5

Obwohl diese Anrufe sind bereits aus dem Haupt-Thread, da iOS 7, scheint in einem Versand Block einige dieser Präsentation Anrufe Einwickeln stark die Verzögerung zu reduzieren

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

Hast du das gemessen? Ich kann kaum verstehen, wie das funktionieren sollte, da es nur die Präsentation in der nächsten Iteration der Hauptschleife ausführt, d. H. Tatsächlich _ter_ im Vergleich zu dem, wenn Sie es direkt aufrufen. * verwirrt – DrMickeyLauer