অন্যান্য উত্তরে সম্পূর্ণরূপে আচ্ছাদিত semaphore কৌশল ছাড়াও, এখন আমরা এক্সকোড 6 এ এক্সসিটিস্ট ব্যবহার করতে পারি এর মাধ্যমে অ্যাসিঙ্ক্রোনাস পরীক্ষা করতে 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]]; }