У меня есть некоторый класс А. В этом классе у меня есть метод,
который вызывает [self performSelectorInBackground:...]
. И начинается загрузка
немного информации из интернета.
После того, как я коснусь кнопки «Домой», затем снова войду в приложение, этот фоновый метод продолжает работать.
Так что, если я вызову этот метод снова, у меня будет bad_access, потому что фоновый метод уже работает, и я вызываю его дважды.
Могу ли я прекратить выполнять селектор в фоновом режиме класса A? Например в моем приложении DidEnterBackground?
Или я могу проверить, работает ли селектор или что-то еще?
Я нашел пару вещей, как
[[NSRunLoop currentRunLoop] cancelPerformSelectorsWithTarget:a];
[NSObject cancelPreviousPerformRequestsWithTarget:a selector:@selector(startDownload) object:nil];
Но они не работали для меня.
Так
my objAppDelegate:
@inteface ObjAppDelegate
{
A *a;
}
@implementation ObjAppDelegate
{
-(void)applicationDidEnterBackground:(UIApplication *)application
{
//or it can be didBecomeActive..
//here. check if background task of class A is running, or just stop it ??
}
}
@implementation A
{
//some timer, or event, etc.
-(void)startDownload
{
[self performSelectorInBackground:@selector(runBackgroundTask) withObject:nil];
}
-(void)runBackgroundTask
{
//some network stuff..
}
}
Я сделал это так:
<pre>
threadForDownload = [[NSThread alloc] initWithTarget:self selector:@selector(threadMain:) object:nil];
[threadForDownload start];
[self performSelector:@selector(startDownload) onThread:threadForDownload withObject:nil waitUntilDone:NO];</p>
<ul>
<li><p>(void)threadMain:(id)data {
NSAutoreleasePool *pool = [NSAutoreleasePool new];</p>
<p>NSRunLoop *runloop = [NSRunLoop currentRunLoop];
[runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];</p>
<p>while (YES) {
[runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}</p>
<p>[pool release];
}</p></li>
</ul>
<p>
В моем методе startDownload я смотрю на индикатор активности, чтобы проверить,
startDownload уже запущен ..
<pre>
-(void)startDownload
{
if (![[UIApplication sharedApplication] isNetworkActivityIndicatorVisible]) // flag..
{
//....
}
}
// Я делаю видимым networkActivityIndicator каждый раз, когда начинаю скачивать