SWIFT – cum folosim Closures?

Closures în SWIFT au fost gândite și folosite ca un exemplu de funcții inline. Din experiența mea, “closures” sunt folosite în completion blocks pentru a notifica faptul că un block și-a terminat activitatea.

Un mic exemplu didactic – Universitatea din Toronto:

func performMagic (spell: String) -> String {
return spell
}

Avem o funcție simplă ce va primi printr-un argument un string și-l va returna.

Vom folosi closure pentru a defini o variabilă ce va “conține” corpul acestei funcții:

var newPerformMagic = {
(spell:String) -> String in
return spell
}

Pnetru a utiliza, e suficient
newPerformMagic(“test de closure”)

Share Button

Raphaël Marionneau

Îmi place Abstrait. Cafe Abstrait. Iar Raphaël Marionneau este cel ce-a definit acest concept. Le Café Abstrait Vol. 6 cred că este cel mai bun exemplu al acestui curent.
Acum îl ascult pe Raphaël Marionneau aici, sesiunile fiind luate de pe mixcloud.

Share Button

Application Lifecycle – IOS

Metodele marcate cu rosu sunt importante in procesul de Data Persistence – folosire NSCoding.

IOS - application lifecycle

Share Button

Diagrama MVC – IOS

O aplicatie bine facuta IOS respecta principiile programarii MVC – Model – View – Controller.
O explicatie vizuala foarte buna despre “circulatia” in interiorul unei aplicatii IOS in poza de mai jos:
Model MVC IOS

In cazul in care datele din Model sunt aduse dintr-un JSON, exista posibilitatea ca ceea ce se doreste a se afisa in View sa NU existe la momentul afisarii, acest lucru datorandu-se faptului ca initializarea din JSON se face asincron:

MVC JSON fara NSNotification

Pentru a remedia acest aspect, avem nevoie de o intarziere. O intarziere care este de fapt o notificare pe care, atunci cand apare, o va capta controller-ul si va “da drumul” la executarea elementelor de View:

Model MVC cu NSNotification

Share Button

Completion handler în main thread

De fapt, vreau să am content-ul de la JSON-ul de twitter afișat atunci cănd rulez aplicația.
Cu secvența de mai jos – trebuie sa dau click

dispatch_async(dispatch_get_main_queue(), ^{
// NSURLSession – model prima faza
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
NSError *jsonParsingError = nil;
NSDictionary *jsonResults = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonParsingError];
//din JSON in NSDictionary doar itemul STATUSES
self.results = jsonResults[@”statuses”];
[self.tableView reloadData];

}];
[dataTask resume];
});

De ce?
Pentru că UI-ul trebuie să fie actualizat doar din main thread. Dacă testez cu [[NSThread currentThread] isMainThread], aflu că nu sunt în main thread.
Așa că modific codul astfel:


[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
NSError *jsonParsingError = nil;
NSDictionary *jsonResults = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonParsingError];
if (jsonParsingError)
{
NSLog(@”Eroare la JSON=%@”, jsonParsingError);
}
self.results = jsonResults[@”statuses”];
//din JSON in NSDictionary doar itemul STATUSES
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
if ([[NSThread currentThread] isMainThread]){
NSLog(@”Sunt in main thread”);
}
else{
NSLog(@”Nu sunt in main thread”);
}
});
}];
[dataTask resume];

În acest moment aplicația funcționează perfect.

Share Button