मैं एक NSOperationQueue जो 2 NSOperations होता है और स्थापित करने setMaxConcurrentOperationCount
1.समस्याएं रकम जुटा समवर्ती एवं गैर समवर्ती NSOperations
संचालन से एक एक मानक गैर समवर्ती ऑपरेशन है (द्वारा एक के बाद उन्हें एक प्रदर्शन करने के लिए सेट कर दिया जाता है बस एक main
विधि) जो वेब से कुछ डेटा (पाठ्यक्रम के अलग-अलग ऑपरेशन थ्रेड पर) को समकालिक रूप से पुनर्प्राप्त करता है। दूसरा ऑपरेशन एक समवर्ती ऑपरेशन है क्योंकि मुझे कुछ कोड का उपयोग करने की आवश्यकता है जिसे असीमित रूप से चलाना है।
समस्या यह है कि मैंने पाया है कि समवर्ती ऑपरेशन केवल तभी काम करता है जब इसे कतार में जोड़ा जाता है। यदि यह किसी भी गैर-समवर्ती परिचालन के बाद आता है, तो अजीब तरह से start
विधि को ठीक कहा जाता है, लेकिन उस विधि के समाप्त होने के बाद और मैंने कॉलबैक के लिए अपना कनेक्शन सेटअप किया है, यह कभी नहीं करता है। कतार में कोई और संचालन निष्पादित नहीं किया जाता है। ऐसा लगता है कि यह प्रारंभ विधि रिटर्न के बाद लटकता है, और किसी भी यूआरएल कनेक्शन से कोई कॉलबैक नहीं कहा जाता है!
यदि मेरे समवर्ती ऑपरेशन को कतार में पहले रखा गया है तो यह सब ठीक काम करता है, एसिंक कॉलबैक काम करता है और इसके बाद के ऑपरेशन को पूरा होने के बाद निष्पादित किया जाता है। मैं बिल्कुल समझ में नहीं आता!
आप नीचे मेरे समवर्ती एनएसओपरेशन के लिए टेस्ट कोड देख सकते हैं, और मुझे पूरा यकीन है कि यह ठोस है।
किसी भी मदद की सराहना की जाएगी!
मुख्य थ्रेड अवलोकन:
मैं बस पता चला है कि अगर समवर्ती ऑपरेशन कतार पर पहला है तो [start]
विधि मुख्य थ्रेड पर बुलाया जाता है। हालांकि, अगर यह कतार पर पहले नहीं है (यदि यह समवर्ती या गैर-समवर्ती के बाद है) तो [start]
विधि मुख्य धागे पर नहीं बुलाया जाता है। यह महत्वपूर्ण लगता है क्योंकि यह मेरी समस्या के पैटर्न को फिट करता है। इसका क्या कारण रह सकता है?
समवर्ती NSOperation कोड:
@interface ConcurrentOperation : NSOperation {
BOOL executing;
BOOL finished;
}
- (void)beginOperation;
- (void)completeOperation;
@end
@implementation ConcurrentOperation
- (void)beginOperation {
@try {
// Test async request
NSURLRequest *r = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]];
NSURLConnection *c = [[NSURLConnection alloc] initWithRequest:r delegate:self];
[r release];
} @catch(NSException * e) {
// Do not rethrow exceptions.
}
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSLog(@"Finished loading... %@", connection);
[self completeOperation];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
NSLog(@"Finished with error... %@", error);
[self completeOperation];
}
- (void)dealloc {
[super dealloc];
}
- (id)init {
if (self = [super init]) {
// Set Flags
executing = NO;
finished = NO;
}
return self;
}
- (void)start {
// Main thread? This seems to be an important point
NSLog(@"%@ on main thread", ([NSThread isMainThread] ? @"Is" : @"Not"));
// Check for cancellation
if ([self isCancelled]) {
[self completeOperation];
return;
}
// Executing
[self willChangeValueForKey:@"isExecuting"];
executing = YES;
[self didChangeValueForKey:@"isExecuting"];
// Begin
[self beginOperation];
}
// Complete Operation and Mark as Finished
- (void)completeOperation {
BOOL oldExecuting = executing;
BOOL oldFinished = finished;
if (oldExecuting) [self willChangeValueForKey:@"isExecuting"];
if (!oldFinished) [self willChangeValueForKey:@"isFinished"];
executing = NO;
finished = YES;
if (oldExecuting) [self didChangeValueForKey:@"isExecuting"];
if (!oldFinished) [self didChangeValueForKey:@"isFinished"];
}
// Operation State
- (BOOL)isConcurrent { return YES; }
- (BOOL)isExecuting { return executing; }
- (BOOL)isFinished { return finished; }
@end
रकम जुटा कोड
// Setup Queue
myQueue = [[NSOperationQueue alloc] init];
[myQueue setMaxConcurrentOperationCount:1];
// Non Concurrent Op
NonConcurrentOperation *op1 = [[NonConcurrentOperation alloc] init];
[myQueue addOperation:op1];
[op1 release];
// Concurrent Op
ConcurrentOperation *op2 = [[ConcurrentOperation alloc] init];
[myQueue addOperation:op2];
[op2 release];
मुझे भी यही समस्या मिली। लेकिन मेरे मामले में स्टार्ट विधि को कभी-कभी नए जोड़े गए ऑपरेशन के लिए भी नहीं बुलाया जाता है। कतार अभी भी 'रनिंग' स्थिति दिखाती है। तो ऊपर विधि का उपयोग नहीं किया जा सकता है। क्या आप कोई अन्य समाधान जानते हैं? कृपया सहायता कीजिए.. –