multithreading - CoreAnimation चेतावनी ने बिना काटे हुए CATransaction के साथ थ्रेड को हटा दिया




core-animation nsoperation (2)

आपका शक सही है। यदि CoreAnimation प्रदर्शन करने से पहले NSOperation पूरा हो जाता है, तो आपको एक अच्छी चेतावनी मिलती है:

* CoreAnimation: चेतावनी, हटाए गए थ्रेड के साथ अनकम्यूटेड कैटरेनेशन; वातावरण में वापस लौटने के लिए CA_DEBUG_TRANSACTIONS = 1 सेट करें। *

यह कुछ परिस्थितियों में भी हो सकता है जब एक कतार पर भेजा गया ब्लॉक CoreAnimation से कुछ काम चलाता है और CoreAnimation के पूर्ण होने से पहले वापस आ जाता है।

मेरे द्वारा उपयोग किया जाने वाला समाधान सरल है: CoreAnimation से काम का अनुरोध करने वाले ब्लॉक या NSOperation पर, मैं जांचता हूं कि काम वास्तव में बाहर निकलने से पहले पूरा हो गया है।

आपको एक सबूत-अवधारणा का उदाहरण देने के लिए, यह एक प्रेषण कतार पर भेजा जाने वाला एक ब्लॉक है। चेतावनी से बचने के लिए, हम जांचते हैं कि बाहर निकलने से पहले CoreAnimation किया गया है।

^{

   // 1. Creating a completion indicator

   BOOL __block animationHasCompleted = NO;

   // 2. Requesting core animation do do some work. Using animator for instance.

   [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context){
      [[object animator] perform-a-nice-animation];
   } completionHandler:^{
      animationHasCompleted = YES;
   }];

   // 3. Doing other stuff…

   …

   // 4. Waiting for core animation to complete before exiting

   while (animationHasCompleted == NO)
   {
       usleep(10000);
   }

}

मुझे निम्नलिखित चेतावनी के साथ समस्या हो रही है:

CoreAnimation: चेतावनी, हटाए गए थ्रेड को अप्रयुक्त CATransaction के साथ; वातावरण में वापस लौटने के लिए CA_DEBUG_TRANSACTIONS = 1 सेट करें।

मैं कुछ गणना करने के लिए एक NSOperation ऑब्जेक्ट का उपयोग कर रहा हूं, एक बार पूरा होने पर यह AppDelegate को एक संदेश भेजता है जो तब एक प्रगति बार को छुपाता है और कुछ बटन को अनहाइड करता है। अगर मैं संदेश वापस AppDelegate में टिप्पणी करता हूं तो चेतावनी दूर हो जाती है लेकिन प्रगति बार स्पष्ट रूप से दिखाई और एनिमेटेड रहती है।

मैं xCode 4.4.1 और OSX 10.8.1 का उपयोग कर रहा हूं, हालांकि, जब मैं OSX 10.7.4 पर xCode के समान संस्करण का उपयोग करके कोड संकलित करता हूं और चलाता हूं तो मुझे चेतावनी नहीं मिलती है और कोड अपेक्षित रूप से चलता है।

CA_DEBUG_TRANSACTIONS = 1 पर्यावरण चर सेट करना ऐपडेलीगेट में एक NSControl setEnabled संदेश से आने के रूप में बैकट्रेस दिखाता है।

जवाब शायद मुझे घूर रहा है लेकिन शायद मैंने बहुत ज्यादा कॉफी पी है!


किसी भी यूआई ड्राइंग को सुनिश्चित करने का एक अन्य तरीका मुख्य थ्रेड पर होता है, जैसा कि न्यूमिस्ट द्वारा वर्णित है, विधि performSelectorOnMainThread:withObject:waitUntilDone: का उपयोग कर रहा है performSelectorOnMainThread:withObject:waitUntilDone: या वैकल्पिक रूप से performSelectorOnMainThread:withObject:waitUntilDone:modes:

- (void) someMethod
{
    [...]

    // Perform all drawing/UI updates on the main thread.
    [self performSelectorOnMainThread:@selector(myCustomDrawing:)
                           withObject:myCustomData
                        waitUntilDone:YES];

    [...]
}

- (void) myCustomDrawing:(id)myCustomData
{
    // Perform any drawing/UI updates here.
}


performSelectorOnMainThread:withObjects:waitUntilDone: dispatch_async() और performSelectorOnMainThread:withObjects:waitUntilDone: बीच के अंतर पर संबंधित पोस्ट के लिए performSelectorOnMainThread:withObjects:waitUntilDone: Whats को performSelectorOnMainThread:withObjects:waitUntilDone: और dispatch_async के बीच अंतर को मुख्य कतार में देखें?





catransaction