Я пытаюсь проверить некоторые классы, которые я создал, которые выполняют сетевые действия, используя класс NSNetServer
, среди прочих. У меня возникли некоторые проблемы, гарантирующие, что вызывается метод делегата.
Я пробовал множество методов, в том числе:
Используя [NSThread sleepForTimeInterval:5.0f];
и [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5.0f]];
, просто остановитесь, пока происходят другие действия. Метод NSRunLoop
работает в первый раз, когда он вызывается (как показано в примере кода ниже), но сбой во втором вызове. Я не понимаю, что это "правильный" способ делать вещи, но я не знаю, что такое "правильный".
Использование классов NSCondition
и NSConditionLock
, которые просто блокируют код, и обратный вызов никогда не вызывается.
Использование цикла while
для переменной, измененной в методе обратного вызова, так же, как указано выше.
Ниже приведен код с несколькими дополнительными комментариями, а некоторые из тестов удалены для простоты:
- (void)testCheckCredentials
{
[self.server start];
// Create a client
self.nsb = [[NSNetServiceBrowser alloc] init];
// Set the delegate to self
self.nsb.delegate = self;
// Search for the server
[self.nsb searchForServicesOfType:self.protocol inDomain:@""];
// Wait for the service to be found and resolved
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:self.timeout]];
XCTAssertTrue(self.serviceWasFound, @"Service was not found");
// Open the connection to the server
XCTAssertTrue([self.serverConnection open], @"Connection to server failed to open");
// Wait for the client to connect
/* This is where it crashes */
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:self.timeout]];
XCTAssertTrue(self.clientDidConnect, @"Client did not connect");
/* Further, more class-specific tests */
}
- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)service moreComing:(BOOL)moreComing
{
NSLog(@"Found a service: %@ (%@)", service.name, service.domain);
if ([self.serverName isEqualToString:service.name]) {
self.serviceWasFound = YES;
}
}
- (void)clientDidConnect:(RCFClientConnection *)client
{
XCTAssertNotNil(client, @"Connected client is nil");
self.clientConnection = client;
self.clientDidConnect = YES;
}
Я также попытался сделать lock
в объекте NSCondition
:
[self.nsb searchForServicesOfType:self.protocol inDomain:@""];
// Wait for the service to be found and resolved
[self.lock lockWhenCondition:1];
XCTAssertTrue(self.serviceWasFound, @"Service was not found");
и
self.serviceWasFound = YES;
[self.lock unlockWithCondition:1]
При использовании метода блокировки метод netServiceBrowser:didFindService:moreComing:
никогда не вызывается, тот же, когда я использую:
while (!self.serviceWasFound) {};
Я все еще участвую Objective-C, но я просто полностью застрял в этой проблеме.