अन्य जवाबों में पूरी तरह से कवर किए गए सेमीफोर तकनीक के अलावा, हम अब अतुल्यकालिक परीक्षण करने के लिए Xcode 6 में XCTest का उपयोग कर सकते हैं XCTestExpectation
। यह एसिंक्रोनस कोड का परीक्षण करते समय अर्धचालक की आवश्यकता को समाप्त करता है। उदाहरण के लिए:
- (void)testDataTask
{
XCTestExpectation *expectation = [self expectationWithDescription:@"asynchronous request"];
NSURL *url = [NSURL URLWithString:@"http://www.apple.com"];
NSURLSessionTask *task = [self.session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
XCTAssertNil(error, @"dataTaskWithURL error %@", error);
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
NSInteger statusCode = [(NSHTTPURLResponse *) response statusCode];
XCTAssertEqual(statusCode, 200, @"status code was not 200; was %d", statusCode);
}
XCTAssert(data, @"data nil");
// do additional tests on the contents of the `data` object here, if you want
// when all done, Fulfill the expectation
[expectation fulfill];
}];
[task resume];
[self waitForExpectationsWithTimeout:10.0 handler:nil];
}
भविष्य के पाठकों के लिए, जबकि डिस्पैच सेमाफोर तकनीक एक अद्भुत तकनीक है, जब पूरी तरह से जरूरत होती है, मुझे यह स्वीकार करना चाहिए कि मैं बहुत से नए डेवलपर्स को देखता हूं, जो अच्छे अतुल्यकालिक प्रोग्रामिंग पैटर्न से अपरिचित हैं, अतुल्यकालिक बनाने के लिए एक सामान्य तंत्र के रूप में अर्धचालक के लिए बहुत तेज़ी से गुरुत्वाकर्षण देता है दिनचर्या तुल्यकालिक व्यवहार करती है। इससे भी बदतर, मैंने देखा है कि उनमें से कई मुख्य कतार से इस सेमाफोर तकनीक का उपयोग करते हैं (और हमें उत्पादन कतार में मुख्य कतार को कभी भी अवरुद्ध नहीं करना चाहिए)।
मुझे पता है कि यहां ऐसा नहीं है (जब यह सवाल पोस्ट किया गया था, तो एक अच्छा उपकरण नहीं था XCTestExpectation
, इन परीक्षण सूटों में, हमें यह सुनिश्चित करना चाहिए कि परीक्षण तब तक समाप्त नहीं होगा जब तक कि एसिंक्रोनस कॉल नहीं किया जाता है)। यह उन दुर्लभ स्थितियों में से एक है जहां मुख्य धागे को अवरुद्ध करने के लिए अर्ध-तकनीक आवश्यक हो सकती है।
तो इस मूल प्रश्न के लेखक के लिए मेरी क्षमायाचना के साथ, जिनके लिए सेमाफोर तकनीक ध्वनि है, मैं उन सभी नए डेवलपर्स के लिए यह चेतावनी लिखता हूं, जो इस सेमाफोर तकनीक को देखते हैं और इसे असंगत से निपटने के लिए एक सामान्य दृष्टिकोण के रूप में अपने कोड में लागू करने पर विचार करते हैं। विधियाँ: बताया जा सकता है कि दस में से नौ बार, सेमाफोर तकनीक है नहीं हैअतुल्यकालिक संचालन का सामना करते समय सबसे अच्छा तरीका। इसके बजाय, अपने आप को पूर्ण ब्लॉक / क्लोजर पैटर्न, साथ ही प्रतिनिधि-प्रोटोकॉल पैटर्न और सूचनाओं से परिचित कराएं। ये अक्सर अतुल्यकालिक कार्यों से निपटने के बेहतर तरीके होते हैं, बजाय इसके कि वे समकालिक व्यवहार करें। आमतौर पर अच्छे कारण हैं कि अतुल्यकालिक कार्यों को अतुल्यकालिक व्यवहार करने के लिए डिज़ाइन किया गया था, इसलिए उन्हें समकालिक व्यवहार करने की कोशिश करने के बजाय सही अतुल्यकालिक पैटर्न का उपयोग करें।
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
के साथwhile (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW)) { [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]]; }