Moja klasa modeli musi pobrać pewne dane z Internetu. Postanowiłem więc uruchomić go w innym wątku, aby ui nie zamarzł. Więc kiedy obiekt chce jakieś dane to najpierw pyta model używając metody tego typu:Metoda uruchamiania głównego wątku z innego wątku
- (void)giveMeSomeData:(id)object withLabel:(id)label {
objectAsking= object;
theLabel= label;
NSThread* thread= [[NSThread alloc] initWithTarget:self selector:@selector(getTheDataFromInternet) object:nil];
[thread start];
}
- (void)getTheDataFromInternet {
//getting data...
theData= [dataFromInternet retain]; //this is the data the object asked for
[self returnObjectToAsker];
}
- (void)returnObjectToAsker {
[objectAsking receiveData:theData withLabel:theLabel];
}
Ponieważ jestem jeszcze nowicjuszem, możesz mi powiedzieć, czy jest to dobry wzór?
Dzięki!
Nie zapomnij wydać tego, co tworzysz, zgodnie z zasadami zarządzania pamięcią. http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html Z kodu, który pokazałeś, powinieneś posiadać i, jeśli nie działa pod GC, ostatecznie zwolnić zarówno "wątek" jak i " theData ". –
Również brzmi to tak, jak 'getTheDataFromInternet' robi to synchronicznie. Nie rób tego - będziesz blokować swój interfejs użytkownika przez ileś milisekund/sekund/minut/godzin/dni, aby pobrać dane. Nie ma znaczenia jak mały jest on ani jak niesamowite jest twoje własne połączenie internetowe - Twoi użytkownicy zobaczą, że twoja aplikacja blokuje się podczas oczekiwania na dane. Zamiast tego utwórz (i przejąć) połączenie NSURLConnection, aby otrzymywać asynchronicznie: http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/ Zgłoś postęp za pomocą (przynajmniej) NSProgressIndicator. –
Oczywiście zdecydowałem się nie pisać tych linii dla zachowania przejrzystości;) –