Узнайте, когда все процессы в (void) завершены? - PullRequest
0 голосов
/ 09 июня 2010

Мне нужно знать, как можно узнать, когда все процессы (загруженные) из - (void) завершены, если это возможно.

Почему?Я загружаю данные для UITableView, и мне нужно знать, когда представление Loading... можно заменить на UITableView, и когда я могу начать создавать ячейки.

Это мой код:

- (void) reloadData {
    NSAutoreleasePool *releasePool = [[NSAutoreleasePool alloc] init];

    NSLog(@"Reloading data.");
    NSURL *urlPosts = [NSURL URLWithString:[NSString stringWithFormat:@"%@", URL]];
    NSError *lookupError = nil;
    NSString *data = [[NSString alloc] initWithContentsOfURL:urlPosts encoding:NSUTF8StringEncoding error:&lookupError];
    postsData = [data componentsSeparatedByString:@"~"];
    [data release], data = nil;
    urlPosts = nil;

    self.numberOfPosts = [[postsData objectAtIndex:0] intValue];
    self.postsArrayID = [[postsData objectAtIndex:1] componentsSeparatedByString:@"#"];
    self.postsArrayDate = [[postsData objectAtIndex:2] componentsSeparatedByString:@"#"];
    self.postsArrayTitle = [[postsData objectAtIndex:3] componentsSeparatedByString:@"#"];
    self.postsArrayComments = [[postsData objectAtIndex:4] componentsSeparatedByString:@"#"];
    self.postsArrayImgSrc = [[postsData objectAtIndex:5] componentsSeparatedByString:@"#"];


    NSMutableArray *writeToPlist = [NSMutableArray array];
    NSMutableArray *writeToNoImagePlist = [NSMutableArray array];
    NSMutableArray *imagesStored = [NSMutableArray arrayWithContentsOfFile:[rootPath stringByAppendingPathComponent:@"imagesStored.plist"]];
    int loop = 0;
    for (NSString *postID in postsArrayID) {
        if ([imagesStored containsObject:[NSString stringWithFormat:@"%@.png", postID]]){
            NSLog(@"Allready stored, jump to next. ID: %@", postID);
            continue;
        }
        NSLog(@"%@.png", postID);

        NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[postsArrayImgSrc objectAtIndex:loop]]];

        // If image contains anything, set cellImage to image. If image is empty, try one more time or use noImage.png, set in IB
        if (imageData == nil){
            NSLog(@"imageData is empty before trying .jpeg");

            // If image == nil, try to replace .jpg with .jpeg, and if that worked, set cellImage to that image. If that is also nil, use noImage.png, set in IB. 
            imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[[postsArrayImgSrc objectAtIndex:loop] stringByReplacingOccurrencesOfString:@".jpg" withString:@".jpeg"]]];

        }
        if (imageData != nil){
            NSLog(@"imageData is NOT empty when creating file");
            [fileManager createFileAtPath:[rootPath stringByAppendingPathComponent:[NSString stringWithFormat:@"images/%@.png", postID]] contents:imageData attributes:nil];
            [writeToPlist addObject:[NSString stringWithFormat:@"%@.png", postID]];
        } else {
            [writeToNoImagePlist addObject:[NSString stringWithFormat:@"%@", postID]];

        }
        imageData = nil;

        loop++;

        NSLog(@"imagePlist: %@\nnoImagePlist: %@", writeToPlist, writeToNoImagePlist);
    }
    NSMutableArray *writeToAllPlist = [NSMutableArray arrayWithArray:writeToPlist];

    [writeToPlist addObjectsFromArray:[NSArray arrayWithContentsOfFile:nowPlist]];

    [writeToAllPlist addObjectsFromArray:[NSArray arrayWithContentsOfFile:[rootPath stringByAppendingPathComponent:@"imagesStored.plist"]]];

    [writeToNoImagePlist addObjectsFromArray:[NSArray arrayWithContentsOfFile:[rootPath stringByAppendingPathComponent:@"noImage.plist"]]];

    [writeToPlist writeToFile:nowPlist atomically:YES];
    [writeToAllPlist writeToFile:[rootPath stringByAppendingPathComponent:@"imagesStored.plist"] atomically:YES];
    [writeToNoImagePlist writeToFile:[rootPath stringByAppendingPathComponent:@"noImage.plist"] atomically:YES];
    [releasePool release];
}

1 Ответ

0 голосов
/ 14 июня 2010

Это так же просто, как вернуть bool в нижней части селектора, работающего в фоновом режиме, и заново узнать UITableView.

Благодаря @iWasRobbed:

Я никогда не делал этого, но просто размышлял: пытались ли вы вернуть BOOL в самом конце, чтобы функция reloadData возвращала TRUE, когда достигнет этой точки? Я предполагаю (возможно, неправильно), что устройство последовательно выполняет задачи по одному, так что попробуйте.

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