14

प्रस्तुत करने में लंबा समय लगता है मैंने आईफोन के लिए एक ऐप बनाया है। अब, मैं इसे आईपैड के लिए पुन: प्रयास कर रहा हूं।UIActivityViewController को

जब उपयोगकर्ता टूलबार में एक्शन बटन का चयन करता है, तो एक पॉपओवर UIActivityViewController के साथ दिखाना चाहिए, लेकिन किसी कारण से, इसे पहली बार दिखाने के लिए लगभग 10 सेकंड लगते हैं। आईफोन पर, इसमें लगभग एक सेकंड लगता है। पॉपओवर को छोड़कर यह वही कोड है।

मैंने पॉपओवर को अक्षम करने का प्रयास किया, लेकिन इसे दिखाने के लिए लगभग 10 सेकंड लगते हैं।

यहाँ कोड है:

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

मैं अपने आईपैड 3 और मेरे iPad मिनी पर परीक्षण किया है, दोनों कुछ समय लग इस पेश करने के लिए।

मैं समस्या को कैसे हल कर सकता हूं?

+0

आप समय प्रोफाइलर साथ इसका परीक्षण किया है कम करने लगता है? आप खोज सकते हैं कि अधिकतर समय में कौन से निर्देश हैं। –

+0

नहीं, मैं यह कैसे कर सकता हूं? – Maximilian

+0

प्रेस cmd + I फिर समय प्रोफाइलर का चयन करें। 10-20 सेकेंड के लिए प्रतीक्षा करें। फिर "सिस्टम सिस्टम लाइब्रेरी छुपाएं" विकल्प को चेक करें। यह आपको कॉल स्टैक में अपनी विधि बेहतर देखने की अनुमति देगा। कॉल स्टैक में अपनी विधि ढूंढें और क्लिक करें उस पर दो बार, आप समय की खपत देखेंगे। –

उत्तर

18

अच्छा सवाल, मुझे बस एक ही समस्या थी। यह वास्तव में हल करने योग्य नहीं है। हालांकि, अगर आप एक गतिविधि सूचक बनाने और फिर पृष्ठभूमि को UIActivityViewController का आरंभीकरण भेजकर उपयोगकर्ता अनुभव को बेहतर हो सकता है:

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

यह एक आकर्षण की तरह काम करता है। जब उपयोगकर्ता बटन को छूता है, तो गतिविधि संकेतक एनिमेट करना प्रारंभ करता है, इस प्रकार यह इंगित करता है कि प्रक्रिया में कुछ समय लगेगा।

+2

मैं वही सुझाव देता हूं, लेकिन एक अधिक सुरुचिपूर्ण तरीके से। 'UIBarButtonItem' प्रॉपर्टी 'कस्टम व्यू' को फ्लाई पर बनाए गए 'UIActivityIndicator' पर सेट करें। यह बटन आइकन को गतिविधि संकेतक में बदल देता है। फिर, प्रेजेंटेशन एनीमेशन कॉल के पूर्ण ब्लॉक पर '[बटन सेट कस्टम व्यू: शून्य]' और यह मूल शैली पर वापस आ जाएगा। =) –

+0

@ ब्रूनो फिलिप आईओएस 7.0.3 पर कॉलिंग 'सेट कस्टम व्यू: एनआईएल' पर एक UIBarButtonItem सिस्टम आइकन के साथ बनाया गया आइकन पूरी तरह से आइकन को हटाने के लिए प्रतीत होता है। – zekel

+0

@zeckel मैं आईओएस 7.1 बीटा के साथ एक ऐप पर कर रहा हूं और यह ठीक से काम करता है। शायद यह कुछ और है? यदि आपके बटन ने प्रतिस्थापन करने से पहले कस्टम व्यू का उपयोग किया है तो इसे इसे 'nil' पर सेट करने के बजाय इसे वापस बदलने के बजाय इसकी आवश्यकता है। 'CustomView' के पिछले मान की जांच करने का प्रयास करें। –

13

मुझे आईओएस 7 पर एक ही समस्या थी। जब मैंने स्वीकृत गतिविधि प्रकारों से UIActivityTypeAirDrop हटा दिया, हालांकि, नियंत्रक लगभग तुरंत दिखाई देता है।

+0

अजीब बात है, और दुखी है कि ऐप्पल तेज़ नहीं कर सकता: ओ धन्यवाद! – Maximilian

+5

यह पहले से तेज है लेकिन यह अभी भी धीमा है – Gabox

+3

अनुरूप कोड: UIActivityViewController * गतिविधि नियंत्रक = [[UIActivityViewController alloc] initWithActivityItems: साझाकरण अनुप्रयोग अनुप्रयोग: nil]; गतिविधि नियंत्रक। ExcludedActivityTypes = @ [UIActivityTypeAirDrop]; – Beninho85

5

हालांकि इन कॉल मुख्य थ्रेड से पहले से ही कर रहे हैं, iOS 7 के बाद से, एक प्रेषण ब्लॉक में उन लोगों के प्रस्तुति कॉल की कुछ लपेटकर बहुत देरी

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

क्या आपने इसे माप लिया? मैं शायद ही समझ सकता हूं कि यह कैसे काम करना चाहिए, क्योंकि यह मुख्य मेनॉप के अगले पुनरावृत्ति में प्रस्तुतिकरण चलाता है, यानी वास्तव में _later_ की तुलना में जब आप सीधे इसे कॉल करते हैं। * हैरान * – DrMickeyLauer

संबंधित मुद्दे