2012-05-17 15 views
39

मैं कई आपरेशनों (वे अनुरोध AFNetworking रहे हैं) पूरा होने के ब्लॉक है कि कुछ समय निष्पादित करने के लिए लेता है, और एक कोर डाटा वस्तु अंत में बचाया जाना चाहिए के साथ है सभी अनुरोधों का।तक प्रतीक्षा कई नेटवर्किंग अनुरोध सभी निष्पादित किया है - उनके पूरा होने के ब्लॉक सहित

MyCoreDataObject *coreDataObject; 

AFHTTPRequestOperation *operation1 = [[AFHTTPRequestOperation alloc] initWithRequest:request1]; 
[operation1 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    coreDataObject.attribute1 = responseObject; 
    sleep(5); 
}]; 
[operation1 start]; 

AFHTTPRequestOperation *operation2 = [[AFHTTPRequestOperation alloc] initWithRequest:request1]; 
[operation2 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    coreDataObject.attribute2 = responseObject; 
    sleep(10); 
}]; 
[operation1 operation2]; 

[context save:nil]; 

बेशक, यह काम नहीं करता है क्योंकि मैं चाहता हूं क्योंकि अनुरोध असीमित हैं। मैं बहुत की तरह एक NSOperationQueue जोड़ने की कोशिश की:

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 
[operationQueue setMaxConcurrentOperationCount:2]; 

AFHTTPRequestOperation *operation1 = [[AFHTTPRequestOperation alloc] initWithRequest:request1]; 
[operation1 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    coreDataObject.attribute1 = responseObject; 
    sleep(5); 
}]; 
[operationQueue addOperation:operation1]; 

AFHTTPRequestOperation *operation2 = [[AFHTTPRequestOperation alloc] initWithRequest:request1]; 
[operation2 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    coreDataObject.attribute2 = responseObject; 
    sleep(10); 
}]; 
[operationQueue addOperation:operation2]; 

[imageQueue waitUntilAllOperationsAreFinished]; 
[context save:nil]; 

इसमें कुछ समय बेहतर लग रहा है। waitUntilAllOperationsAreFinished का उपयोग करके, मेरी कतार वर्तमान थ्रेड को तब तक अवरुद्ध करती है जब तक कि मेरे अनुरोध समाप्त नहीं हो जाते हैं, लेकिन जब तक मेरी सफलता ब्लॉक समाप्त नहीं हो जाता है, जो वास्तव में मुझे चाहिए।

कैसे एक अच्छा तरीका में इस लक्ष्य को हासिल करने के बारे में कोई भी विचार?

उत्तर

84

उपयोग प्रेषण समूहों।

dispatch_group_t group = dispatch_group_create(); 

MyCoreDataObject *coreDataObject; 

dispatch_group_enter(group); 
AFHTTPRequestOperation *operation1 = [[AFHTTPRequestOperation alloc] initWithRequest:request1]; 
[operation1 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    coreDataObject.attribute1 = responseObject; 
    sleep(5); 
    dispatch_group_leave(group); 
}]; 
[operation1 start]; 

dispatch_group_enter(group); 
AFHTTPRequestOperation *operation2 = [[AFHTTPRequestOperation alloc] initWithRequest:request1]; 
[operation2 setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    coreDataObject.attribute2 = responseObject; 
    sleep(10); 
    dispatch_group_leave(group); 
}]; 
[operation2 start]; 

dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 
dispatch_release(group); 

[context save:nil]; 
+1

धन्यवाद, यह अच्छी तरह से काम करता है। मुझे भी दिलचस्पी है कि थ्रेड को अवरुद्ध किए बिना यह कैसे प्राप्त किया जा सकता है। इसके लिए कोई विचार? – choise

+22

उम, थ्रेड को अवरुद्ध नहीं करते हैं, तो "** ** एकाधिक ऑपरेशन निष्पादित होने तक प्रतीक्षा करें" का क्या मतलब हो सकता है? वैसे भी, यदि आप सभी समापन ब्लॉक चलाए जाने के बाद बस एक ब्लॉक चलाने के लिए चाहते हैं, तो आप 'dispatch_group_wait()' 'प्रेषण_ग्रुप_नोटिफ़ (समूह, कतार,^{...}) का उपयोग कर सकते हैं। –

+1

शांत! धन्यवाद! – choise

15

AFNetworking संचालन इस तरह का है, जो GCD से सार के लिए विधि डिजाइन किया गया है:

-enqueueBatchOfHTTPRequestOperationsWithRequests:progressBlock:completionBlock:

-enqueueBatchOfHTTPRequestOperations:progressBlock:completionBlock:

FAQ

1

पर एक नजर डालें मैं कुछ इस तरह belive :

NSMutableArray *mutableOperations = [NSMutableArray array]; 
for (NSURL *fileURL in filesToUpload) { 
    NSURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
     [formData appendPartWithFileURL:fileURL name:@"images[]" error:nil]; 
    }]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 

    [mutableOperations addObject:operation]; 
} 

NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:@[...] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) { 
    NSLog(@"%lu of %lu complete", numberOfFinishedOperations, totalNumberOfOperations); 
} completionBlock:^(NSArray *operations) { 
    NSLog(@"All operations in batch complete"); 
}]; 
[[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO]; 

डॉक्स की चर्चा करते हुए: http://cocoadocs.org/docsets/AFNetworking/2.5.0/

1

मेरे आवश्यकताओं के उन

func updateSourceData(element: Int) { 

    if element > availableUrls.count - 1 { 
     return 
    } 

    let service = SourceDataServiceDao() 
    let currentUrl = availableUrls[element] 
    service.fooCall(url: currentUrl, completion: { (response, error) -> Void in 
     self.updateSourceData(element + 1) 
    }) 

} 

जाहिर की स्ट्रिंग (यूआरएल) एक सरणी से कई अनुरोध करते हैं, इस तरह से कॉल एन झरना में किया जाता है, नहीं थे असीमित कॉल

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