iphone, если я могу заполнить функцию потока, как я могу выйти? - PullRequest
0 голосов
/ 11 октября 2010

Я добавил свой код заполнения базы данных в метод потока. Однако иногда они могут не содержать каких-либо данных для отображения на графике. Я не хочу запускать запрос дважды, один раз перед тем, чтобы проверить, есть ли какие-либо данные, и я не хочу предварительно заполнять точки графика до функции потока.

Я отметил, где у меня есть заполненный код, ЗДЕСЬ ниже.

Я думаю, что мой единственный вариант - выйти из функции потока, но я немного обеспокоен и хочу сделать это правильно, что мне нужно сделать?

#import "GraphController.h"

@implementation GraphPoint

- (id) initWithID:(int)pkv value:(NSNumber*)number{
    if(self = [super init]){
        pk = pkv;
        value = [number retain];
    }
    return self;

}

- (NSNumber*) yValue{
    return value;
}
- (NSString*) xLabel{
    return [NSString stringWithFormat:@"%d",pk];
}
- (NSString*) yLabel{
    return [NSString stringWithFormat:@"%d",[value intValue]];
}


@end

@implementation GraphController


- (void)viewDidLoad{
    [super viewDidLoad];

    graph.title.text = @"Graph View";

    [graph setPointDistance:15];

    indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
    CGRect r = indicator.frame;
    r.origin = self.view.bounds.origin;
    r.origin.x = self.view.bounds.size.width / 2  - r.size.width / 2;
    r.origin.y = self.view.bounds.size.height / 2  - r.size.height / 2;
    indicator.frame = r;
    [self.view addSubview:indicator];
    [indicator startAnimating];

    data = [[NSMutableArray alloc] init];

    [NSThread detachNewThreadSelector:@selector(thread) toTarget:self withObject:nil];

}

- (void) thread{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//HERE
    srand([[NSDate date] timeIntervalSince1970]);

    for(int i=0;i<100;i++){
        int no = rand() % 100 + i;
        GraphPoint *gp = [[GraphPoint alloc] initWithID:i value:[NSNumber numberWithFloat:no]];
        [data addObject:gp];
        [gp release];
    }

    [self performSelectorOnMainThread:@selector(threadComplete) withObject:nil waitUntilDone:NO];

    [pool drain];
}
- (void) threadComplete{
    [indicator stopAnimating];

    [self.graph setGraphWithDataPoints:data];
    self.graph.goalValue = [NSNumber numberWithFloat:30.0];
    self.graph.goalShown = YES;
    [self.graph scrollToPoint:80 animated:YES];
    [self.graph showIndicatorForPoint:75];
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}
- (void)dealloc {
    [data release];
    [indicator release];
    [super dealloc];
}


@end

Я использую Tapku Graph http://duivesteyn.net/2010/03/07/iphone-sdk-implementing-the-tapku-graph-in-your-application/?utm_source=twitterfeed&utm_medium=twitter

1 Ответ

0 голосов
/ 11 октября 2010

Чтобы закрыть поток, просто return из метода потока.Но не забудьте позвонить [pool release]; (пожалуйста, используйте также вместо [pool drain]; в конце вашего метода; на iOS, где нет GC, они одинаковы, но если Apple однажды решит добавить поддержку GC, они 'все по-другому).

Так что-то вроде этого:

if (wantToCloseThread) {
    // Release everything we've allocated.
    [pool release];
    // Also, if you alloc'ed something that is not autoreleased
    // you should release it here.
    return;
}

Альтернативой является использование goto (да, его использование для этого в порядке):

- (void) thread {

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    ...

    if (something)
       goto out;

    ...

    if (somethingElse)
       goto out;

    ...

out:
    // Cleanup.
    [pool release];
    // Also, if you alloc'ed something that is not autoreleased
    // you should release it here.
}

Таким образом, вы должны написать очистку только один раз, и goto гарантирует, что каждый раз, когда вы действительно хотите покинуть поток, завершается полная очистка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...