मुझे अपने RestAPI से जानकारी का एक समूह सिंक करना होगा। मुझे काम पूरा करने के लिए 6 RestAPI कॉल करना होगा। मैंने ब्लॉक के साथ एपीआई कॉल डिज़ाइन किए हैं, और यदि कोई है तो एनएसईआरआरआर वापस करें। इन कॉलों में से 3 ने नेस्टेड निष्पादित करना चाहिए क्योंकि पहला कॉल दूसरों को जानकारी देता है और निष्पादन की अनुमति देता है जबकि अन्य 3 कॉल स्वतंत्र रूप से चल सकते हैं। नेटवर्क के प्रदर्शन में सुधार के कारण, मैं निम्नलिखित के रूप में मेरे तुल्यकालन कॉल के लिए बनाया गया:NSBlockOperation, NSOperationQueue और ब्लॉक
- 1 NSBlockOperation कि पहले नेस्टेड 3 ब्लॉक होता है;
- 1 एनएसब्लॉकऑपरेशन जिसमें अन्य तीन ब्लॉक शामिल हैं;
- 1 एनएसब्लॉकऑपरेशन जो मैं "सेफोर" के रूप में उपयोग करता हूं और जब सभी काम करता है तो मुझे बताता है।
अंतिम एनएसब्लॉकऑपरेशन पिछले दो एनएसब्लॉकऑपरेशन पर निर्भरता है।
मेरे पास एक NSOperationQueue भी है जिसमें सभी तीन NSBlockOperation शामिल हैं जहां सेफफोर NSBlockOperation को कतार में अंतिम के रूप में जोड़ा जाता है। परिणाम जो मैं प्राप्त करना चाहता हूं वह है: पहले दो ब्लॉक समवर्ती रूप से बुलाए जाते हैं और जब उनका काम खत्म होता है, तो सैमफोर एनएसब्लॉकऑपरेशन को यूआईएलर्ट मैसेज प्रदान करने वाले उपयोगकर्ता को नियंत्रण और रिटर्न नियंत्रित किया जाता है।
परिणाम यह नहीं बताया गया है कि सिंकअल्बब्लॉक्स जानकारी ब्लॉक के अंत का इंतजार किए बिना नियंत्रण लौटाया जाता है।
कोड कि NSBlockOperation शामिल नीचे:
-(void)syncAllBlocksInformation:(void(^)(NSError *error))completion{
__block NSError *blockError = nil;
NSOperation *syncUserInfoOperation = [NSBlockOperation blockOperationWithBlock:^{
[dataSync syncUserInfo:tfMail.text password:tfPassword.text completion:^(NSError *error, NSNumber *idUser) {
if(!error){
[dataSync syncUserfilesInfo:idUser completion:^(NSError *error) {
if(!error){
[dataSync syncUserBookings:^(NSError *error) {
if(error){
blockError = error;
}
}];
}
else{
blockError = error;
}
}];
}
else{
blockError = error;
}
}];
}];
NSBlockOperation *otherSyncOperations = [NSBlockOperation blockOperationWithBlock:^{
[dataSync syncNewsInfo:^(NSError *error) {
if(error){
blockError = error;
NSLog(@"error %@",error);
}
}];
}];
[otherSyncOperations addExecutionBlock:^{
[dataSync syncLocationsInfo:^(NSError *error) {
if(error){
blockError = error;
NSLog(@"error %@",error);
}
}];
}];
[otherSyncOperations addExecutionBlock:^{
[dataSync syncExoticAnimalTypesAndAnimals:^(NSError *error) {
if(error){
blockError = error;
NSLog(@"error %@",error);
}
}];
}];
NSOperation *completionOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"END");
}];
[completionOperation setCompletionBlock:^{
NSLog(@"Syc isEx %i",syncUserInfoOperation.isExecuting);
NSLog(@"other isEx %i",otherSyncOperations.isExecuting);
completion(blockError);
}];
NSOperationQueue *opQueue = [NSOperationQueue new];
[completionOperation addDependency:syncUserInfoOperation];
[completionOperation addDependency:otherSyncOperations];
[opQueue addOperation:syncUserInfoOperation];
[opQueue addOperation:otherSyncOperations];
[opQueue addOperation:completionOperation];
}
और यहाँ, कोड है कि ब्लॉक के ऊपर कॉल:
-(IBAction)login:(id)sender{
[self dismissKeyboardOpened:nil];
hud=[MBProgressHUD showHUDAddedTo:self.view animated:YES];
[hud setLabelText:NSLocalizedString(@"login_hud_message", login_hud_message)];
[hud setMode:MBProgressHUDModeIndeterminate];
[self showHudAndNetworkActivity:YES];
[self syncAllBlocksInformation:^(NSError *error) {
[self showHudAndNetworkActivity:NO];
if(!error){
NSLog(@"End LOGIN");
[self showAlert:@"Login" message:@"Login OK" dismiss:YES];
}
else{
[self showAlert:@"Error" message:@"Login NO" dismiss:NO];
}
}];
}
क्या गलत है?
क्या आपने एनएसओपरेशन क्यूयूयू को संलग्न कक्षा के एक आवृत्ति चर बनाने की कोशिश की है? –
मैंने किया। मैंने इंस्टेंस वैरिएबल के रूप में घोषित किया और मैंने इसे ViewDidLoad में तुरंत चालू कर दिया। कुछ नहीं बदला। – dpizzuto