четверг, 26 марта 2015 г.

Как использовать AFNetworking 2.0

Небольшой туториал по использованию  AFNetworking 2.0 

GET


1
2
3
4
5
6
7
8
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://samwize.com/api/poos/"
  parameters:nil
     success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

POST


1
2
3
4
5
6
7
8
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager POST:@"http://samwize.com/api/poo/"
   parameters:@{@"color": @"green"}
      success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

POST Multi-Part (в несколько частей)

Схоже с POST, но с данными (в этом случае, картинкой) в теле, разбитыми на несколько частей. 

1
2
3
4
5
6
7
8
9
10
11
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"];
[manager POST:@"http://samwize.com/api/poo/"
   parameters:@{@"color": @"green"}
   constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    [formData appendPartWithFileURL:filePath name:@"image" error:nil];
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

Связка операций

Выше использовался AFHTTPRequestOperationManager и обычно этого вполне достаточно.
Но, если Вам необходима связка операций, то вы должны использовать
AFHTTPRequestSerializerAFHTTPRequestOperation и NSOperationQueue.
Образец кода ниже прямо из AFNetworking:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
NSMutableArray *mutableOperations = [NSMutableArray array];
for (NSURL *fileURL in filesToUpload) {
    NSURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"http://example.com/upload" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
        [formData appendPartWithFileURL:fileURL name:@"images[]" error:nil];
    }];

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

    [mutableOperations addObject:operation];
}

NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:@[...] progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
    NSLog(@"%lu of %lu complete", numberOfFinishedOperations, totalNumberOfOperations);
} completionBlock:^(NSArray *operations) {
    NSLog(@"All operations in batch complete");
}];
[[NSOperationQueue mainQueue] addOperations:operations waitUntilFinished:NO];


Немного еще 
Выше приведенные примеры используют стандартный AFJSONResponseSerializer – что значит ответ должен быть в формате JSON.
Если вы обрабатываете XML или другие данные, то вам нужен другой вид serializer'a.

1
2
3
4
5
// Чтобы обрабатывать XML
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFXMLParserResponseSerializer new];
// Или данные
manager.responseSerializer = [AFHTTPResponseSerializer new];

AFNetworking очень строг с Content-Type (типом контента).
Поэтому, если ваш ответ типа “text/plain”, когда вы используете JSON serializer, можно поступить так:

1
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];

Разница между opaque, hidden и alpha

Разница между opaque (непрозрачность), hidden(скрыто) и alpha  свойствами для UIView

Согласно UIView class reference:


  • opaque указывает системе, то view не имеет прозрачности, а значит рендеринг будет быстрее, потому что расчеты смешивания слоев(blending) будут опущены. 
  • hidden логическое свойство, которое изменяет только видимость конкретного view и прячет его от ui событий. 
  • alpha  анимируемое свойство. 
Выставление alpha = 0.0f or hidden = YES будет иметь тот же визуальный эффект. Стоит использовать hidden , чтобы реально спрятать uiview не только в графическом смысле, но и от ui event'ов будет лучше, особенно если у вас много вложенных view.
Однако, UIKit работает примерно так же для очень низких значений alpha, так как с hidden (если выставить alpha = 0.0f, то ui event'ы тоже будут игнорироваться). 

среда, 11 марта 2015 г.

Как спрятать tab bar / status bar / navigation bar

Для tab bar используйте hidesBottomBarWhenPushed. Например:
UIViewController *myController = [UIViewController new]; 
myController.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:myController animated:YES];
Чтобы спрятать status bar используйте:
[[UIApplication sharedApplication] setStatusBarHidden:YES];
Чтобы спрятать  nav bar:
self.navigationController.navigationBarHidden = YES;