2011-10-17 12 views
7

में काम नहीं कर रहा है मेरे पास एक प्रोजेक्ट है जो NSOperationQueue का उपयोग करके पृष्ठभूमि में छवियों को डाउनलोड करता है। यह अब तक आईओएस 4.3 के साथ उपकरणों पर काम कर रहा था। हालांकि अगर मैं बेस एसडीके 4.3 या 5 के साथ ऐप का निर्माण करता हूं और आईओएस 5 के साथ डिवाइस पर ऐप चलाता हूं, तो ऐप क्रैश हो जाता है। जब ऐप लॉन्च किया जाता है, तो यह छवियों को डाउनलोड करने के लिए NSOperation ऑब्जेक्ट्स कतार में जोड़ता है। अगर बीच में मैं बटन वापस दबाते हैं, तो मैं NSOperation रद्द करने और यह दुर्घटनाओं और प्रदर्शित करता है कंसोल पर निशान निम्नलिखित:NSOperationQueue IOS5

 
#0 0x004727b7 in ____NSOQSchedule_block_invoke_0() 
#1 0x026a5618 in _dispatch_call_block_and_release() 
#2 0x026a7a10 in _dispatch_worker_thread2() 
#3 0x974bb781 in _pthread_wqthread() 
#4 0x974bb5c6 in start_wqthread() 

और प्रिंट "ResourceLoadOperation isFinished = हाँ कतार में है द्वारा शुरू किया जा रहा है बिना" अगर मैं टिप्पणी रद्द विधि कॉल, ऐप क्रैश नहीं करता है। क्या आईओएस 5 के लिए NSOperation परिवर्तनों पर कोई अपडेट है?

+0

मुझे एक ही समस्या है। NSOperation ऑब्जेक्ट की रिहाई पर टिप्पणी करते हुए, जैसा कि आपने कहा था, लेकिन मुझे यकीन नहीं है कि स्मृति प्रबंधन इस मामले में सही है ... –

+0

हाँ बस रद्द करने की विधि पर टिप्पणी करना स्मृति प्रबंधन के मामले में सही नहीं हो सकता है। लेकिन क्या आईओएस 5 में प्रसंस्करण की गति की समस्या है जो इस मुद्दे को आईओएस 4.3 उपकरणों पर ठीक काम करता है? – CKT

उत्तर

12

मैं जब आईओएस 5 के खिलाफ निर्माण इस एक ही समस्या थी मैं एक झंडा operationStarted नामित कि NO डिफ़ॉल्ट रूप से था बना दी और मैं जब start विधि बुलाया गया था YES को चालू किए जाने। फिर मेरे finish विधि (जहां मैं केवीओ अधिसूचनाएं उत्पन्न करता हूं) में, मैंने अधिसूचनाओं को फायर करने से पहले ध्वज के मूल्य की जांच की।

@property (nonatomic, assign, getter=isOperationStarted) BOOL operationStarted; 

start विधि:

- (void)start { 
    [self setOperationStarted:YES]; 
    ... 
} 

मेरे finish विधि है जो जब आपरेशन पूरा हो गया है कहा जाता है या रद्द कर दिया गया है:

- (void)finish {  
    if (![self isOperationStarted]) return; 

    [self willChangeValueForKey:@"isExecuting"]; 
    executing = NO; 
    [self didChangeValueForKey:@"isExecuting"]; 

    [self willChangeValueForKey:@"isFinished"]; 
    finished = YES; 
    [self didChangeValueForKey:@"isFinished"]; 
} 

झंडा परिभाषा इस तरह दिखता है यह मेरे लिए इस मुद्दे को हल करने के लिए समाप्त हो गया। उम्मीद है कि यह किसी और की मदद करता है।

+0

मुझे उत्सुकता है कि आपको ऑपरेशन की आवश्यकता क्यों है स्टार्टेड प्रॉपर्टी जब आप पहले से ही एक ही उद्देश्य के लिए सस्ता है? –

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