Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Zdjęcie
- - - - -

Pasek ładowania - problem z odświeżaniem UIProgressView


  • Zaloguj się, aby dodać odpowiedź
3 odpowiedzi w tym temacie

#1 pio11

pio11
  • 1 700 postów

Napisano 10 października 2015 - 19:49

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 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ż :P.



#2 Mouts

Mouts
  • 78 postów
  • Płeć:

Napisano 10 października 2015 - 23:31

Możliwe że gadam głupoty ale może pobaw się dispatchem?

#3 pio11

pio11
  • 1 700 postów

Napisano 11 października 2015 - 12:19

Niestety. Za każdym razem jak chcę uaktualniać UIProgressView w MainThread nic się nie dzieje. Nie wiem za bardzo jak rozwiązać ten problem :/



#4 daf

daf
  • 121 postów

Napisano 11 października 2015 - 18:14

A spróbuj zamiast:

float progress = (float)ItemsDownloadedCount/(float)ItemsToDownloadCount;

zrobić:

float progress = (float)ItemsDownloadedCount/ItemsToDownloadCount;
[self.LoadingProgressView setProgress:progress animated:YES];

Wiem, że to niby masło maślane, ale mi ostatnio też nie chciał ruszyć przy rzutowaniu na dwa float i ruszył jak zrobiłem raz.






Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych