Ответы пользователя по тегу Objective-C
  • Какие существуют best practices по загрузке и хранению данных в мобильной бд?

    alexyat
    @alexyat
    iOS Developer
    Что касается вк, то там посты не сохраняются в бд, они держится в памяти. Не вижу смысла хранить их в БД, слишком быстро устаревают.
    Ответ написан
  • В чем причина вылета программы при построении маршрута от точки А к Б?

    alexyat
    @alexyat
    iOS Developer
    там же написано в чем причина, обращение в пустой массив к элементу 0
    Ответ написан
  • Обработка нажатий кнопок?

    alexyat
    @alexyat
    iOS Developer
    могу показать на примере obj-c
    -(void)buttonTap:(UIButton)buttonTaped
    {
       someLabel.text = [buttonTaped titleForState:UIControlStateNormal];
    }

    подвязать можно ко всем кнопкам, при нажатии там будет сработавшая кнопка и ее надпись будет перенесена в текстовый лейбл
    Ответ написан
    Комментировать
  • P2p сеть между ios устройствами?

    alexyat
    @alexyat
    iOS Developer
    могу посоветовать изучить клиенты DC++ для Mac, это программы для обмена файлами + там есть встроенный чат.

    https://github.com/rufuscoder/shakespeer
    https://github.com/eiskaltdcpp/eiskaltdcpp
    Ответ написан
    Комментировать
  • Как сохранить корректно данные при отправке нескольких GET запросов?

    alexyat
    @alexyat
    iOS Developer
    По идее это вообще не должно работать, т.к. и сам NSURLConnection асинхронный так вы еще асинхронный диспач делаете. Я бы сразу в диспатче, вот так бы сделал
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^
                       {
                           NSString *_resultResponse = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://blabla.com/user?id=1"] usedEncoding:NSUTF8StringEncoding error:nil];
                           _homesJSON = [HomesModel arrayOfModelsFromString:_resultResponse error:nil];
                           if (_homesJSON)
                               NSLog(@"Data homes saved.");
                       });

    это в стиле х*як-х*як и в продакшен

    и еще если вы общаетесь с сервером по http, а не по https, то в Info.plist нужно добавить App Transport Security Settings как на скриншоте

    20bc025b23a54105bf1769834669805e.png
    Ответ написан
    2 комментария
  • Как в Obj-C организовать многопоточное скачивание файла с нескольких "юзеров" (источников)?

    alexyat
    @alexyat
    iOS Developer
    Ничем не отличается от обычной загрузки, только нужно побить на куски файл. При первом коннекте выясняете размер файла делите его на нужное количество частей и порождаете новые закачки с указанием стартовых байтов и отрубаете при достижении размера куска.
    Ответ написан
    Комментировать
  • Что использовать вместо синглтон сервер-менеджера?

    alexyat
    @alexyat
    iOS Developer
    Первый раз про такое слышу. Другое дело как его писать и для каких он целей, какие ограничения. Нужно ответить на такие вопросы:
    - запросы могут выполнятся параллельно или должны быть строго последовательны?
    Из своего опыта я пришел к выводу что лучше всего использовать очередь (если планируется реализация под iOS меньше 7 - то использовать NSOperationQueue + NSOperation, если 7+ то NSURLSession + NSURLSessionDownloadTask) И в зависимости от ответа выставлять максимальное количество исполняемых закачек.
    - должен ли прерываться запрос если приложение свернули
    этот вопрос актуален если реализуете по iOS 7+ NSURLSessionDownloadTask - может быть предназначен для загрузки в background.
    - после одного запроса нужно обновлять данные в одном ViewController, или в нескольких (тут же и смешано).
    Из своего опыта нашел более-менее универсальное решение, после того как пришел ответ запрос, он сразу обрабатывается внутри менеджера и используется NSNotificationCenter для оповещение всех нужных контроллеров.
    Ответ написан
    Комментировать
  • UINavigationController?

    alexyat
    @alexyat
    iOS Developer
    Почитайте про паттерн, Singleton, это класс который существует всегда, хранит данные и доступен во всех остальных классах. Через него удобно организовывать передачу данных между классами.
    Ответ написан
    Комментировать
  • Как делать интерфейс для всех гаджетов?

    alexyat
    @alexyat
    iOS Developer
    советую не мучаться и для начала воспользоваться вот этой либой, она очень сильно упростит вам жизнь. https://github.com/smileyborg/PureLayout
    Ответ написан
    Комментировать
  • Как сделать textview=contentsize?

    alexyat
    @alexyat
    iOS Developer
    я использую вот такую функцию
    задаете шрифт и ширину которую будете использовать в лабеле. И отправляете вместе с текстом. И получаете высоту текста.
    +(CGFloat)sizeForText:(NSString *)text withFont:(UIFont *)font withWidth:(float)width
    {
    	CGSize constraint = CGSizeMake(width, 20000.0f);
    	CGSize size = [text sizeWithFont:font
    				   constrainedToSize:constraint 
    					   lineBreakMode:NSLineBreakByWordWrapping];
    	return size.height;
    }
    Ответ написан
    Комментировать
  • Как передать данные между ios приложениями?

    alexyat
    @alexyat
    iOS Developer
    Все достаточно просто, приложение которе передает данные должно создать
    UIDocumentInteractionController;

    UIDocumentInteractionController *_controller;
    
    if(!_controller)
                _controller = [[UIDocumentInteractionController alloc]init];
            _controller.delegate = self;
            NSURL *documentURL = @"тут должен быть урл в файловой системе, в который записаны данные которые нужно передать";
            _controller.URL = documentURL;
            if(![_controller presentOpenInMenuFromRect:cell.frame inView:self animated:YES])
            {
                NSLog(@"can't open in another app");
            }
            else
                NSLog(@"Open in another app");
    
    // ну и делигат методы
    
    - (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller {
        
        return  self;// это вьюв контроллер в котором будет всплывающее меню с выбором аппа который будет открывать.
    }
    
    - (void)documentInteractionController:(UIDocumentInteractionController *)controller willBeginSendingToApplication:(NSString *)application {
        
        NSLog(@"Starting to send this puppy to %@", application);
    }
    
    - (void)documentInteractionController:(UIDocumentInteractionController *)controller didEndSendingToApplication:(NSString *)application {
        
        NSLog(@"We're done sending the document.");
    }


    в принимающем аппе нужно в Info.plist добавить Exported Type UTIs, и добавить при запуске аппа обработку launchOptions

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions


    что-то типа вот такого

    NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
    NSData* data = [NSData dataWithContentsOfURL:url];


    и делать уже что угодно с этой NSData, преобразовывать в то что вам нужно.

    подробнее как добавить вашему аппу возможность открывать файлы написано тут главное чтобы файл который вы создали в первом аппе был с тем же расширением которое вы зарегистрируете во втором.
    Ответ написан
    2 комментария
  • Как передать управление нажатием на объект в основной контроллер?

    alexyat
    @alexyat
    iOS Developer
    2 и 3 это одно и тоже. 1 способ(с notifications) используется если нужно оповестить несколько разрозненных объектов. Думаю в Вашем случаи проще всего сделать ссылку на контроллер в CardView.
    Ответ написан
  • Заполнить view кнопками?

    alexyat
    @alexyat
    iOS Developer
    а что мешает заполнять относительно первой рандомной кнопки по кругу от нее, или от каждой новой созданной последующей.
    Ответ написан
    Комментировать
  • Как получить изображения с IPad на Mac?

    alexyat
    @alexyat
    iOS Developer
    можно через airplay, по другому никак.
    Ответ написан
    Комментировать
  • Как правильно интегрировать iAd в iOS-приложение?

    alexyat
    @alexyat
    iOS Developer
    Для iOS 7 ничего практически не изменилось, куча гайдов гуглятся за 1 минуту. То что на скрине это https://chartboost.com
    Ответ написан
    Комментировать
  • UIWebView: как вести историю URL-адресов на ajax-сайтах?

    alexyat
    @alexyat
    iOS Developer
    NSURLProtocol вам в помощь, eng.42go.com/customizing-uiwebview-requests-with-n... видит все http запросы.
    Например моя заготовка для детекта mp3, чтобы зарегать класс, выполняю. этот код

    [NSURLProtocol registerClass:[MP3DetectURLProtocol class]];


    MP3DetectURLProtocol.h
    #import <Foundation/Foundation.h>
    
    @interface MP3DetectURLProtocol : NSURLProtocol
    
    @property (nonatomic, strong) NSURLConnection *connection;
    
    @end


    MP3DetectURLProtocol.m
    #import "MP3DetectURLProtocol.h"
    
    @implementation MP3DetectURLProtocol
    
    static NSString *PBProxyURLHeader = @"X-PB";
    
    + (BOOL)canInitWithRequest:(NSURLRequest *)request
    {
        //if([[request.URL absoluteString] rangeOfString:@"mp3"].length !=0)
            NSLog(@"request url = %@", [request.URL absoluteString]);
        if ([request valueForHTTPHeaderField:PBProxyURLHeader] == nil)
        {
            return YES;
        }
        return NO;
    }
    
    + (NSURLRequest *) canonicalRequestForRequest:(NSURLRequest *)request
    {
        return request;
    }
    
    - (void) startLoading
    {
        NSMutableURLRequest *newRequest = [self.request mutableCopy];
        [newRequest setValue:@"" forHTTPHeaderField:PBProxyURLHeader];
        // Here we set the User Agent
        //[newRequest setValue:@"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.2 Safari/537.36 Kifi/1.0f" forHTTPHeaderField:@"User-Agent"];
        
        //[NSURLProtocol setProperty:@YES forKey:@"UserAgentSet" inRequest:newRequest];
        //NSLog(@"start loading");
        self.connection = [NSURLConnection connectionWithRequest:newRequest delegate:self];
    }
    
    - (void)stopLoading
    {
        //[self.connection cancel];
    }
    
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
        [self.client URLProtocol:self didLoadData:data];
    }
    
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    {
        [self.client URLProtocol:self didFailWithError:error];
        self.connection = nil;
    }
    
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
        [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed];
    }
    
    - (NSURLRequest *)connection:(NSURLConnection *)connection
                 willSendRequest:(NSURLRequest *)request
                redirectResponse:(NSURLResponse *)response
    {
        [self.client URLProtocol:self wasRedirectedToRequest:request redirectResponse:response];
        return nil;
    }
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
        [self.client URLProtocolDidFinishLoading:self];
        self.connection = nil;
    }
    
    @end
    Ответ написан
  • MVC в IOS: может ли Model иметь Delegate к контролеру?

    alexyat
    @alexyat
    iOS Developer
    Может, можете написать все что душе угодно. Только на картинке что вы запостили, там написано в Model - KVO & Notification, и лучше использовать их при обновлении данных в модели, т.к. обычно об обновлении данных нужно узнать нескольким Controller, сделать это проще через notification, а Key-Value Observing нужно когда один контроллер следит за какой-то переменной.
    Ответ написан
    Комментировать
  • Как записать данные в конец файла с помощью NSFileCoordinator при сохранении UIDocument в iCloud?

    alexyat
    @alexyat
    iOS Developer
    Дозапись в файл делается через хендлер, например вот так:

    NSString *dir = [pathCache stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.download", [itemToDownload fileName]]];
        if(data)
            [tmpData appendData:data];
        if(![tmpData length])
            return;
        NSFileHandle *handle = [NSFileHandle fileHandleForWritingAtPath:dir];
        [handle seekToEndOfFile];
        [handle writeData:tmpData];
        [handle closeFile];
        [tmpData setLength:0];

    где tmpData это NSData
    Ответ написан
  • Как остановить UIActivityIndicatorView?

    alexyat
    @alexyat
    iOS Developer
    Вот из-за таких проблем я всем рекомендую отказаться от использования Interface builder.
    Ответ написан
  • Как вывести неопределенное количество строк в iOS?

    alexyat
    @alexyat
    iOS Developer
    Есть стандартный контрол UITextView, вы можете сделать его любого размера, и кинуть ему текст, а он сам добавит скролл, если надо. Также не забудьте выставить свойство editable в NO, чтобы он не давал редактировать текст.
    Ответ написан
    Комментировать