RSS
piątek, 24 czerwca 2011
Video z WWDC 2011 nareszcie dostępne!

W końcu to, na co wszyscy czekaliśmy (no a przynajmiej wszyscy ci, którzy interesują się iOS-em i technologiami Apple)! Firma z Cupertino udostępniła dziś nagrania video sesji konferencji WWDC 2011, która odbyła się w San Francisco w dniach 6-10 czerwca.

 

Nagrania można obejrzeć/pobrac tutaj (link otwiera się w nowym oknie).

 

Polecam!

czwartek, 23 czerwca 2011
Wykorzystanie stałych z pakietów w zapytaniach SQL
Definiowanie i wykorzystanie stałych, przynajmniej ja, uważam za dobra praktykę. Zdecydowanie lepsza niż wprowadzanie tej samej, często nieoczywistej, wartości w 20+ rożnych miejscach. Czasami zachodzi także konieczność wykorzystania tych wartości w zapytaniach SQL. Możemy oczywiście dla każdej z nich zdefiniować odpowiednie funkcje publiczne i w większości przypadków sprawdza sie to świetnie co jednak gdy mamy takich stałych kilkadziesiąt? Pakiet i jego specyfikacja rozrosłyby nam się niepotrzebnie.
piątek, 17 czerwca 2011
Programowanie iPhone - iOS/iPhone - "recovery" save

 

Czyli cos o applicationWillTerminate, applicationWillResignActive i applicationDidEnterBackground

 

W malej aplikacji, nad którą pracuje, chciałem mieć pewność, że dane wprowadzane przez użytkownika będą zawsze poprawnie zapisane, nawet w wypadku, gdy wciśnie on przypadkowo przycisk Home, bądź, gdy system z jakiegokolwiek innego powodu zakończy jej działanie.

 

Ze względu na specyfikę iPhone-a, nasz program może zostać przerwany w każdej chwili, dlatego staram się sie utrwalać jego stan w miarę regularnie. Podstawowa metodę zapisującą dane zaimplementowałem w zdarzeniu viewWillDissapear. Rozwiązanie takie nie sprawdzi sie niestety w sytuacji, gdy działanie aplikacji zostanie niespodziewanie przerwane, w momencie, gdy użytkownik wprowadza dane.

 

Z pomocą przychodzą nam oczywiście metody dostępne w obiekcie aplikacji: applicationWillTerminate, applicationWillResignActive oraz applicationDidEnterBackground. Niestety UIViewControler żadnej z tych metod nie posiada, nie jest tez automatycznie informowany o zajściu któregokolwiek z tych zdarzeń. Aby to rozwiązać musimy wykorzystać mechanizm powiadomień (notifications).

 

Rozwiązanie, które zaimplementowałem i które proponuje, polega na zarejestrowaniu naszego kontrolera w centrum powiadomień (notification centre) tak, aby był on informowany o zajściu któregokolwiek ze wspomnianych zdarzeń. Możemy zrobić to podczas ładowania naszego widoku w metodzie viewDidLoad w następujący sposób:

 

//Rejestracja jako obserwator zdarzenia UIApplicationWillTerminateNotification
[[NSNotificationCenter defaultCenter]
                       addObserver:self
                          selector:@selector(applicationWillTerminate:)
                              name:UIApplicationWillTerminateNotification
                            object:[UIApplication sharedApplication]]; 

 

//Rejestracja jako obserwator zdarzenia UIApplicationWillResignActiveNotification
[[NSNotificationCenter defaultCenter]
                       addObserver:self
                          selector:@selector(applicationWillResignActive:)
                              name:UIApplicationWillResignActiveNotification
                            object:[UIApplication sharedApplication]]; 

 

//Rejestracja jako obserwator zdarzenia UIApplicationDidEnterBackgroundNotification
//Uwaga! Zdarzenie dostepne jedynie iOS 4.0 + . Proba rejestracji zdarzenie w systemie < iOS 4.0 spowoduje crash aplikacji.
[[NSNotificationCenter defaultCenter]
                       addObserver:self
                          selector:@selector(applicationDidEnterBackground:)
                              name:UIApplicationDidEnterBackgroundNotification
                            object:[UIApplication sharedApplication]]; 

 

Następnym krokiem jest zaimplementowanie odpowiednich metod:

 

- (void) applicationWillResignActive:(UIApplication *)application {
    NSLog(@"Application will resign active...");
    //...nasz kod...
}

 

- (void) applicationWillTerminate:(UIApplication *)application {
    NSLog(@"Application will terminate...");
    //...nasz kod...
}

 

- (void) applicationDidEnterBackground:(UIApplication *)application {
    NSLog(@"Application did enter background...");
    //...nasz kod...
}

 

W nowszym systemie (iOS 4.0+) metoda applicationWillTerminate nie jest z reguły wywoływana. Zamiast niej wywoływana jest metoda applicationWillResignActive a następnie applicationDidEnterBackground i nasz program zaczyna działać w tle. W iOS 4.0+ to właśnie ta ostatnia metoda powinna być używana do zwolnienia wykorzystywanych zasobów oraz zapisania stanu aplikacji, w tym danych wprowadzanych przez użytkownika. Oczywiście applicationWillTerminate może być wywołana nawet w nowszym systemie w sytuacji, gdy musi on, z jakiegoś powodu zatrzymać masz program, lub gdy użytkownik zdecyduje sie na jego ręczne usuniecie z listy aplikacji działających 'w tle'.

 

To również ta metoda jest wywoływana w momencie przerwania aplikacji w starszych systemach iOS.

 

System daje nam około 5-ciu sekund na wykonanie wszystkiego, w przeciwnym razie może on usunąć nasz proces z pamięci przed jego zakończeniem. Możemy także zażądać dodatkowego czasu na wykonanie wszystkiego wykorzystując metodę beginBackgroundTaskWithExpirationHandler po dodatkowe szczegóły zapraszam do lektury UIApplicationDelegate Protocol Reference (link otworzy sie w nowym oknie).

środa, 15 czerwca 2011
Witam niedzielnych, i nie tylko, programistów :)

 

Juz od paru miesięcy myślałem o założeniu bloga, który jednocześnie byłby czymś w rodzaju 'notatnikia'.


Ileż to razy zdarzało mi sie natknąć na jakiś problem, czasami przyznam trywialny, rozwiązać go, postanawiając jednocześnie, że gdzie to zanotuje, ale albo robiłem to na przysłowiowej serwetce albo po prostu ta chwila 'natchnienia' mijała i nic z pisania nie wychodziło.

Dziś postanowiłem to zmienić, a właściwie to wczoraj :)

Jeśli chodzi o tematykę to, jak nietrudno odgadnąć, Bedzie on o programowaniu,
o technologiach, które wykorzystuje (nie tylko w niedziele) miedzy innymi o Oraclu,
narzędziu PowerBuilder (używa tego ktoś jeszcze?) i trochę o iOS. Będę próbował pokazywać tu
praktyczne rozwiązania rzeczywistych problemów, które niekoniecznie musza być optymalne, najlepsze, ale na 100% działają.

Pamiętajcie, że sam ciągle się uczę i liczę tu na wasza pomoc :)

Zapraszam do lektury i dzielenia sie własnymi doświadczeniami / tipsami.

21:31, m0rt1m3r
Link Dodaj komentarz »
Tagi




PowerBuilder Tetris
D - Tetris



Programowanie iOS

C# ToolBox

SQL / TSQL / PLSQL ToolBox

Linux / Unix ToolBox





Zaprzyjaznione Strony

Sprite Bandits

Cake Time