Один небольшой вопрос :, почему Xcode жалуется, что listing 1
приведет к циклу сохранения, а в listing 2
этого не происходит? В обоих случаях _clients
является переменной экземпляра int
. В listing 2
ему присваивается 0
в методе init
.
Справочная информация :Я хотел бы выполнить цикл в блоке, если хотя бы один клиент запрашивает обновления с акселерометра iPhone, которые я публикую на канале Redis. Если больше не останется клиентов, цикл завершится и перестанет публиковать данные акселерометра.
Listing 2
исходит из небольшого тестового приложения, которое я написал, чтобы убедиться, что моя идея работает. Listing 1
реализован в реальном проекте.
- (id)init {
self = [super init];
if (self) {
_clients = 0;
/**
* The callback being executed
*/
_callback = ^ {
while (_clients > 0) { // Capturing 'self' strongly in this block is likely to lead to a retain cycle
NSLog(@"Publish accelerometer data to redis (connected clients: %d)", _clients);
}
};
}
return self;
}
- (void)touchedConnectButton:(id)sender {
_clients += 1;
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(concurrentQueue, ^() {
while(_clients > 0) {
NSLog(@"Connected clients: %d", _clients);
}
});
}