В моем приложении для iPhone я использую стороннюю библиотеку (libPusher) для работы в сети через WebSockets, и эта библиотека приводит к тому, что каждый компонент UIScrollView в моем приложении перестает отвечать на запросы.Это включает в себя UIScrollViews и UITableView.
Что происходит, если пользователь прокручивает пальцем один из компонентов UIScrollView и продолжает касаться пальцем и скользить по нему в то же время, когда выполняется сетевая операция, то это приводит ксовершенно не отвечающий UIScrollView, который перестает принимать сенсорные события (он думает, что он все время находится в режиме перетаскивания, даже когда палец поднят) и не замедляется соответствующим образом.Единственный выход - уничтожить UIScrollView и воссоздать новый.
Я связался с разработчиком библиотеки, но, к сожалению, пока не получил ответ.
Из того, что я прочитал, это распространенная проблема при запуске цикла выполнения в неподходящем режиме, таком как NSDefaultRunLoopMode
, однако эта библиотека , кажется, делает правильные вещии он запускает цикл выполнения в NSRunLoopCommonModes
, поэтому мне неясно, каково правильное решение.
Я пытался играть в разных режимах (пробовал NSDefaultRunLoopMode
), но поведение такое же.
Я использую iOS 5, и на симуляторе, и на устройствах такое же поведение.
Позвольте мне вставить код, который, на мой взгляд, проблематичен в lib и надеюсь, чтохватит, чтобы ты помог мне найти решение.
В подклассе NSOperation мы имеем:
- (void)start
{
NSAssert(URLRequest, @"Cannot start URLRequestOperation without a NSURLRequest.");
[self setExecuting:YES];
URLConnection = [[NSURLConnection alloc] initWithRequest:URLRequest delegate:self startImmediately:NO];
if (URLConnection == nil) {
[self setFinished:YES];
}
// Common modes instead of default so it won't stall uiscrollview scrolling
[URLConnection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[URLConnection start];
do {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
} while (!_isFinished);
}
Эта операция выполняется в потоке main , как в [[NSOperationQueue mainQueue] addOperation:authOperation];
.(возможно, это проблема, но я попытался запустить его в другом потоке, и он вылетает, поэтому библиотеке понадобится больше работы, чтобы сделать ее безопасной в фоновом режиме, поэтому я пока не могу доказать, что это решение ...)
До сих пор я пытался
- изменить режим цикла выполнения на
NSDefaultRunLoopMode
- не помогло. - запуск операции в новой очереди операций, которую я создал (например, не в главном потоке), но библиотека, кажется, не готова к этому, так как она падает.
Я все еще чувствую, что стреляю в темноте ... help:)
спасибо!