Hej,
Mam kolejny problem podczas pisania aplikacji. Wydawał mi się na początku błachy ale teraz mam wrażenie, że będę musiał przepisać połowę aplikacji dlatego zanim to zrobię chciałem spytać się o radę.
Obecnie piszę aplikację, która pobiera dane z internetu. Mam dwa obiekty: MainViewController gdzie tworzę cały interfejs użytkownika i DataManager gdzie pracuję na plikach. Na początku po załadowaniu widoku sprawdzam zmiany na serwerze.
[NSURLConnection sendAsynchronousRequest:[[NSURLRequest alloc] initWithURL:dataURL] queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if (error) {
//Baza nie została pobrana
} else {
//Pobieram bazę
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if (dataFileExists) { //Porównaj i wgraj zsynchronizowaną bazę: localDataArray i downloadedDataArray
if ([localDataArray isEqual:DownloadedDataArray]) {
[self.delegate dataWasLoaded];
}
} else {
[self synchronizeAllTheFiles]; //Tutaj synchronizuję całą bazę
[self.delegate dataWasLoaded];
}
}];
}
}];
Następnie po tym jak okaże się, że są zmiany na serwerze, synchronizuję całość. W poniższej metodzie są dwie delegacje: beginUploadDataBaseWithNumberOfObjectsToDownload i fileWasDownloaded. Pierwsza mówi ile plików jest do pobrania, a druga nabija +1 do pobranych plików. Obie rzeczy skierowane są do MainViewController.
- (void)synchronizeAllTheFiles {
NSMutableArray *arrayWithLinksToDownload = [[NSMutableArray alloc] init]; //Tablica linków do pobrania
[self.delegate beginUploadDataBaseWithNumberOfObjectsToDownload:[arrayWithLinksToDownload count]]; //Tutaj przekazuję MainViewController ilość rzeczy jakie są do pobrania
for (int d = 0; d < [arrayWithLinksToDownload count]; d++) { //Pętla pobierająca zebrane linki
//Dane pobrane z internetu
if (urlData) { //Jeżeli dane są pobrane
[urlData writeToFile:filePath atomically:YES]; //Zapisz na dysku
[self.delegate fileWasDownloaded]; //MainViewController dowiaduje się o kolejnym pobranym pliku
}
}
}
Poniżej są metody delegacji zamieszczone w MainViewController
- (void)beginUploadDataBaseWithNumberOfObjectsToDownload:(int)numberToDownload {
IfDownloadingData = YES;
ItemsToDownloadCount = numberToDownload;
ItemsDownloadedCount = 0;
}
- (void)fileWasDownloaded {
ItemsDownloadedCount++;
float progress = (float)ItemsDownloadedCount/(float)ItemsToDownloadCount;
NSLog(@"%ld/%li - %f", (long)ItemsDownloadedCount, (long)ItemsToDownloadCount, progress);
[self.LoadingProgressView setProgress:progress animated:YES];
}
Problem polega na tym, że mimo wszystko ProgressView nie jest uaktualniany i dopiero po pobraniu wszystkich plików pojawia się 100%. Próbowałem już przez NSTimer, który niestety wyłącza się na czas działania powyższego kodu. Raz udało mi się doprowadzić do tego aby on działał jednak wtedy przez cały czas w logach pokazywało mi się 0% i dopiero po ostatnim okrążeniu timera pojawiała się setka.
Kombinowałem na różne sposoby ale nie wiem jak to rozwiązać. Może wy dostrzegacie jaki błąd popełniam bo mi ten kod mieni się już .