مشاوره رایگان
دریافت لینک های دانلود دریافت پستی درب منزل مبلغ کل: تومان
جهت دریافت کد تخفیف به کانال تلگرام مراجعه و یا با پشتیبان آنلاین هماهنگ نمایید

جلسه سی ام آموزش iOS : آموزش کار با JSON جیسون به همراه مثال


در این جلسه قصد داریم نحوه پشتیبانی JSON  از اپ های iOS را با ایجاد یک اپ ساده از طریق Meetup API ، به شما نشان دهیم. این جلسه آموزشی ، ممکن است نسبت به جلسات قبلی کمی پیچیده تر باشد. انتظار داریم که دانش پایه ای در خصوص JSON و طراحی الگوها را کسب نمایید.

وارد آموزش برنامه نویسی JSON می شویم.

در ابتدا ، بهتر است به این موضوع بپردازیم که ، JSON چیست؟ JSON (اختصار JavaScript Object Notation) یک روش مبتنی بر متن (text-based) ، سبک و روش آسان برای ذخیره سازی و مبادله داده ها می باشد. JSON به طور متداول ، برای ارائه داده های ساختارمند و تبادل اطلاعات در برنامه های کاربردی سرور- کلاینت مورد استفاده قرار می گیرد ، و می تواند به عنوان جایگزینی برای XML باشد. بسیاری ار سرویس هایی که ما هر روز از آنها استفاده می کنیم ، دارای API های مبتنی بر JSON هستند. اکثر اپلیکیشن های iOS از جمله Twitter ، Facebook و Flick ، داده ها را در فرمت JSON به وب سرویس های backend خود ارسال می نمایند.

به عنوان مثال ، نحوه نمایش JSON از یک شیء Movie می تواند مانند کدهای زیر باشد:

{
    "title": "The Amazing Spider-man",
    "release_date": "03/07/2012",
    "director": "Marc Webb",
    "cast": [
        {
            "name": "Andrew Garfield",
            "character": "Peter Parker"
        },
        {
            "name": "Emma Stone",
            "character": "Gwen Stacy"
        },
        {
            "name": "Rhys Ifans",
            "character": "Dr. Curt Connors"
        }
    ]
}

همان طور که مشاهده می کنید ، داده های JSON ، قابل خواندن توسط انسان (human-readable) و راحت تر از XML ، قابل تجزیه (parse) هستند. اگر هنوز درکی از جیسون کسب نکرده اید ، راهنمای JSON Guide را برای کسب اطلاعات بیشتر ، مطالعه نمایید.

از زمان انتشار iOS 5 ، استفاده از iOS SDK ، توانسته است واکشی (fetch) و تجزیه (parse) داده های JSON را ساده تر نماید. در این آموزش ، ما نحوه استفاده از API داخلی (built-in) را برای انجام پرس و جو (query) از API مبتنی بر JSON مربوط به Meetup را نشان خواهیم داد و با داده های برگشت داده شده ، کار خواهیم کرد.

نگاهی بر اپ

قبل از این که وارد بخش کدنویسی شویم ، بیایید نگاهی به آن چه که خواهیم ساخت ، بیاندازیم.

در این آموزش ، ما یک اپ ساده به نام BrowseMeetup  خواهیم ساخت ، که از API عمومی Meetup استفاده می نماید. اگر چیزی در مورد Meetup نشنیده اید ، بهتر است بدانید که Meetup ، بزرگ ترین شبکه از گروه های محلی است. شما می توانید از Meetup برای سازمان دهی یک گروه محلی یا پیدا کردن یکی از هزاران نفری که به صورت رو در رو در Meetup با هم ملاقات دارند ، استفاده نمایید. همانند سایر شبکه های اجتماعی ، Meetup نیز یک API باز ، برای دسترسی به داده های آن ، توسط اپ ها را فراهم نموده است.

اپ BrowseMeetup  از وب سرویس  Meetup، برای جستجوهای گروه هایی که در نزدیکی کاربر هستند استفاده می کند. اپ ، موقعیت مکان فعلی کاربر را دریافت می کند و سپس به صورت خودکار ، گروه های Meetup نزدیک او را لود می نماید.

 

نکته: این اپ از فریم ورک Core Location استفاده می کند. اگر اطلاعاتی در مورد این فریم ورک ندارید ، آموزش ما در مورد نحوه دریافت موقعیت مکانی کاربر در اپ iPhone را مطالعه نمایید.

شروع کار

اکنون زمان آن است که پروژه را برای مدیریت اپلیکیشن BrowseMeetup ، برپا نماییم. Xcode را راه اندازی کرده و یک پروژه جدید مبتنی بر تمپلت Master-Detail Application iOS app ، ایجاد می کنیم. در گزینه های پروژه ، نیاز به انتخاب قابلیت های Storyboard و Automatic Reference Counting داریم. این اپ ، فقط View های iPhone را فراهم می کند ، از این رو ، مقدار iPhone را برای بخش device family انتخاب کرده و پروژه را ذخیره می نماییم. در Storyboard ، بخش DetailsViewController را حذف کرده و رابط کاربری را مطابق تصویر زیر طراحی می کنیم:

تمرکز این آموزش بر روی واکشی داده های JSON و تجزیه کردن آنهاست. برای صرفه جویی در زمان انجام تنظیمات پروژه ، می توانید تمپلت پروژه را از اینجا  download this project template  دانلود کرده و کار را با آن شروع نمایید. تمپلت حاوی رابط کاربری از پیش ساخته شده می باشد و Core Location آن ، نیز پیاده سازی شده است.

کار با API های مربوط به Meetup

قبل از این که بتوانیم با API های Meetup کار کنیم ، ابتدا باید یک حساب کاربری جدید در Meetup ایجاد نماییم. کار را با ایجاد یک account جدید ، رفتن به مستندات API ها و کلیک کردن روی کلید “Request to join this Meetup group” ، شروع می کنیم ، سپس ، اطلاعات لازم را تکمیل کرده و روی کلید “Sign Up” کلیک می کنیم ، در ادامه ، مرحله به مرحله پیش می رویم تا کار انجام شود.

ما از یکی از API های Meetup (یعنی https://api.meetup.com/2/groups ) ، برای واکشی گروه های Meetup برپا شده در یک مکان خاص ، استفاده خواهیم کرد. عملیات call ، به توسعه دهندگان این امکان را می دهد که مکان را با استفاده از طول و عرض جغرافیایی تعیین نمایند. می توانیم عملیات call را با استفاده از API console تست نماییم.

در اینجا یک پاسخ JSON برای درخواست (https://api.meetup.com/2/groups?&sign=true&lat=51.509980&lon=-0.133700&page=1) آورده شده است:

{
"results": [
{
"lon": -0.10000000149011612,
"visibility": "public",
"organizer": {
"name": "William Brown",
"member_id": 3817216
},
"link": "http://www.meetup.com/french-32/",
"state": "17",
"join_mode": "approval",
"who": "LFM members",
"country": "GB",
"city": "London",
"id": 63974,
"category": {
"id": 16,
"name": "language/ethnic identity",
"shortname": "language"
},
"topics": [
{
"id": 185,
"urlkey": "french",
"name": "French Language"
},
{
"id": 264,
"urlkey": "friends",
"name": "Friends"
},
{
"id": 3304,
"urlkey": "expatfrench",
"name": "Expat French"
}
],
"timezone": "Europe/London",
"group_photo": {
"photo_link": "http://photos3.meetupstatic.com/photos/event/7/4/a/b/600_929867.jpeg",
"highres_link": "http://photos3.meetupstatic.com/photos/event/7/4/a/b/highres_929867.jpeg",
"thumb_link": "http://photos3.meetupstatic.com/photos/event/7/4/a/b/thumb_929867.jpeg",
"photo_id": 929867
},
"created": 1034097734000,
"description": "The London French Meetup is the biggest group of French speakers of all ages and nationalities in London. We hold regular events to meet up, talk in French and share interests in French culture whilst having a good time.
We have two main events per month where we have the whole of the upstairs of a pub.
In addition, we organise other regular events such as outings to: restaurants, trendy bars, french films, live music, sports related activities, outdoor events and more...
The organising team is made of volunteers from different nationalities and ages. Our members are made up of: 1/3 French nationals, 1/3 British nationals and 1/3 other nationalities and francophone countries. If you have any ideas or suggestions for events or would like to help please let us know.
A bientôt.
LFM Team.</p>",
"name": "London French Meetup",
"rating": 4.37,
"urlname": "french-32",
"lat": 51.52000045776367,
"members": 4889
}
],
"meta": {
"lon": -0.1337,
"count": 1,
"signed_url": "http://api.meetup.com/2/groups?radius=25.0&order=id&desc=false&offset=0&format=json&lat=51.50998&page=1&fields=&lon=-0.1337&sig_id=109020062&sig=4532ed8f987f940748ebfba0f483a26f756dcba3",
"link": "http://www.meetup.com/2/groups",
"next": "http://www.meetup.com/2/groups?radius=25.0&order=id&format=json&lat=51.50998&page=1&desc=false&offset=1&fields=&sign=true&lon=-0.1337",
"total_count": 4501,
"url": "http://www.meetup.com/2/groups?radius=25.0&order=id&format=json&lat=51.50998&page=1&desc=false&offset=0&fields=&sign=true&lon=-0.1337",
"id": "",
"title": "Meetup Groups v2",
"updated": 1377876449000,
"description": """",
"method": "Groups",
"lat": 51.50998
}
}

طراحی اپلیکیشن و نحوه عملکرد آن

همان طور که قبلاً اشاره کردیم ، Meetup API ، یک method را برای درخواست کردن گروه های یک مکان خاص ، فراهم می کند. داده های مربوط به پاسخ (response) ، در فرمت جیسون ارسال خواهند شد. ما نیاز به یک شیء داریم که می تواند داده ها را بازیابی کرده و شیء دامنه ما را با داده های کد شده ، بسازد. در بخش ذیل ، یک مرور کلی از طراحی اپلیکیشن ارائه شده است ، که نشان می دهد چگونه کلاس ها ساخته شده و با یکدیگر همکاری می کنند تا گروه های meetup را دریافت نمایند:

ممکن است درک شکل فوق برای شما کمی پیچیده باشد. اما اجازه دهید یک شرح مختصر ارائه دهیم. ما یک MeetupManager را ایجاد می کنیم ، که در آن برای گروه های Meetup مربوط به یک مکان خاص ، درخواست ایجاد خواهیم کرد. در اینجا ، MeetupManager به عنوان یک facade عمل می کند. اگر از الگوی طراحی Facade اطلاعی ندارید ، می توانید آن را به عنوان یک هماهنگ کننده کلاس های دیگر ، تصور کنید. Facade تلاش می کند که یک رابط ساده را برای view controller فراهم کند و آن را از پیاده سازی بخش های پایینی ، محفوظ دارد.

کلاس MeetupCommunicator ، برای برقراری ارتباط با Meetup API استفاده می شود. هنگامی که Meetup با JSON-formatted response (پاسخ فرمت شده JSON) جواب می دهد ، ما پاسخ را به GroupBuilder پاس می دهیم ، که شیء Group را می سازد.

MasterViewController  از Core Location برای کشف موقعیت فعلی و اطلاع دادن موقعیت به MeetupManager استفاده می شود تا MeetupManager  ، بتواند گروه های Meetup مربوط به آن موقعیت را دریافت نماید. MeetupManager با کلاس های دیگر برای بازیابی گروه ها ، هماهنگ می شود. هنگامی که گروه ها بازیابی شدند ، MeetupManager با MasterViewController از طریق نماینده ، ارتباط برقرار می کند و گروه های پیدا شده را انتقال می دهد. سپس ، MasterViewController گروه ها را در table view نمایش می دهد.

ایجاد کردن مدل داده JSON

در اینجا ، قصد داریم که پیاده سازی لایه مدل را شروع کنیم. کلاس Group ، اطلاعات گروه را در اپ BrowseMeetup  نشان می دهد و برای ذخیره کردن اطلاعات گروه برگشت داده شده توسط Meetup استفاده می شود. در اینجا ، یک پاسخ نمونه از شیء Group آورده شده است:

{
     lon: -71.12999725341797,
     visibility: "public",
     organizer: {
          name: "Emma",
          member_id: 2161382
     },
     link: "http://www.meetup.com/bloggers/",
     state: "MA",
     join_mode: "closed",
     who: "Bloggers",
     country: "US",
     city: "Cambridge",
     id: 21458,
    category: {
          id: 34,
          name: "tech",
          shortname: "tech"
     },
     topics: [
          {
               id: 198,
               urlkey: "blog",
               name: "Blog"
          },
          {
               id: 772,
               urlkey: "writers",
               name: "Writers"
          }
     ],
     timezone: "US/Eastern",
     group_photo: {
     photo_link: "http://photos3.meetupstatic.com/photos/event/6/4/9/5/600_25749.jpeg",
     highres_link: "http://photos3.meetupstatic.com/photos/event/6/4/9/5/highres_25749.jpeg",
     thumb_link: "http://photos3.meetupstatic.com/photos/event/6/4/9/5/thumb_25749.jpeg",
     photo_id: 25749
     },
     created: 1034097731000,
     description: "This is a group for people that are interested in blogging and meeting others who are interested in blogging. Topics discussed range from blog content to blog software. All interest levels are welcome.",
     name: "The Greater Boston Area Weblogger Meetup Group",
     rating: 3.33,
     urlname: "bloggers",
     lat: 42.38999938964844,
     members: 119
}

کد فوق ، گروه Meetup تکی را نشان می دهد. ما از تمام داده های گروه برگشت داده شده ، استفاده نمی کنیم. فقط از فیلدهای “name” ، “description” ، “who” ، “country” و “city” استفاده می کنیم. این فیلدها برای نمایش در table view اپ ما ، کافی هستند. اکنون ، یک فایل جدید با استفاده از تمپلت کلاس Objective-C ایجاد می کنیم. نام آن را Group گذاشته و آن را به عنوان زیر کلاس NSObject قرار می دهیم و کد زیر را به فایل header اضافه می کنیم:

@interface Group : NSObject
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSString *description;
@property (strong, nonatomic) NSString *who;
@property (strong, nonatomic) NSString *country;
@property (strong, nonatomic) NSString *city;
@end

این خصیصه ها ، اطلاعاتی هستند که ما در اپ خود از آنها برای دستیابی به نتیجه نهایی که قبلاً نشان داده ایم ، استفاده خواهیم کرد.

واکشی داده های JSON با استفاده از Meetup API

ابتدا ، یک فایل جدید با استفاده از تمپلت پروتکل Objective-C ایجاد کرده و نام آن را MeetupCommunicatorDelegate قرار می دهیم. آن را با کد زیر پر می کنیم:

@protocol MeetupCommunicatorDelegate 
- (void)receivedGroupsJSON:(NSData *)objectNotation;
- (void)fetchingGroupsFailedWithError:(NSError *)error;
@end

کلاس MeetupCommunicator  مسئول برقراری ارتباط با API های Meetup و واکشی داده های JSON است. این کلاس به نماینده MeetupCommunicatorDelegate  ، جهت هندل کردن عملیات تجزیه داده های JSON ، تکیه دارد. communicator هیچ درکی از نحوه هندل کردن داده های JSON ندارد و فقط بر ایجاد ارتباط با API های Meetup و واکشی نتیجه خام JSON ، تمرکز دارد.

با نماینده ایجاد شده ، فایل کلاس دیگری ایجاد می کنیم و نام آن را MeetupCommunicator قرار می دهیم. فایل header را باز کرده و کد زیر را در آن قرار می دهیم:

#import 
 
@protocol MeetupCommunicatorDelegate;
 
@interface MeetupCommunicator : NSObject
@property (weak, nonatomic) id delegate;
 
- (void)searchGroupsAtCoordinate:(CLLocationCoordinate2D)coordinate;
@end

ما یک خصیصه برای ردیابی نماینده communicator ایجاد می کنیم ، سپس یک متد برای جستجو گروه ها در مکان خاص ، تعریف می کنیم. در ادامه ، فایل MeetupCommunicator.m را باز کرده و کد زیر را در آن قرار می دهیم:

#import "MeetupCommunicator.h"
#import "MeetupCommunicatorDelegate.h"
 
#define API_KEY @"1f5718c16a7fb3a5452f45193232"
#define PAGE_COUNT 20
 
@implementation MeetupCommunicator
 
- (void)searchGroupsAtCoordinate:(CLLocationCoordinate2D)coordinate
{
    NSString *urlAsString = [NSString stringWithFormat:@"https://api.meetup.com/2/groups?lat=%f&lon=%f&page=%d&key=%@", coordinate.latitude, coordinate.longitude, PAGE_COUNT, API_KEY];
    NSURL *url = [[NSURL alloc] initWithString:urlAsString];
    NSLog(@"%@", urlAsString);
    
    [NSURLConnection sendAsynchronousRequest:[[NSURLRequest alloc] initWithURL:url] queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        
        if (error) {
            [self.delegate fetchingGroupsFailedWithError:error];
        } else {
            [self.delegate receivedGroupsJSON:data];
        }
    }];
}
 
@end

 

Meetup API نیاز دارد که با یک کلید کار کند. اگر حساب کاربری خود را ثبت کرده باشیم ، باید یک کلید را با رفتن به صفحه API Key دریافت کنیم. به سادگی بر روی آیکون قفل کنار textfield کلیک می کنیم تا کلیدی نشان داده شود. متن داخل آن را کپی کرده و مقدار macro API_KEY را با کلید API خود ، جایگزین می کنیم.

همان طور که در ابتدای این بخش اشاره کردیم ، ما از Meetup API زیر برای جستجو کردن گروه در مکان خاص ، استفاده می کنیم. API ، اطلاعات موقعیت مکانی را در قالب طول و عرض جغرافیایی دریافت می کند. در اینجا ، یک نمونه Meetup URL برای برقراری ارتباط ، آورده شده است:

https://api.meetup.com/2/groups?lat=51.509980&lon=-0.133700&page=20&key=1f5718c16a7fb3a5452f45193232

در پیاده سازی متد ، ما ابتدا ، Meetup API URL را با طول و عرض جغرافیایی تعیین شده ، تعداد گروه ها و API key می سازیم. برای جلوگیری از مسدود شدن UI ، داده ها را برای درخواست URL به طور ناهمزمان ، با استفاده از متد “”sendAsynchronousRequest: از NSURLConnection لود می کنیم. در نهایت ، وقتی که داده های JSON بازیابی شدند ، آنها را به نماینده برای پردازش بیشتر ، انتقال می دهیم.

تجزیه کردن داده های JSON و ساخت اشیاء Group

هنگامی که MeetupManager  داده ها را در فرمت JSON دریافت می کند ، ما از متد کلاس GroupBuilder ، برای تبدیل نمودن داده به اشیاء Group استفاده می کنیم. یک فایل جدید با تمپلت کلاس Objective-C ایجاد کرده و نام آن را GroupBuilder قرار می دهیم. فایل header را باز کرده و کد زیر را در آن paste می کنیم:

#import 
 
@interface GroupBuilder : NSObject
 
+ (NSArray *)groupsFromJSON:(NSData *)objectNotation error:(NSError **)error;
 
@end

در ادامه ، فایل “GroupBuilder.m” را باز کرده و متد را با کدهای زیر پیاده سازی می کنیم:

#import "GroupBuilder.h"
#import "Group.h"
 
@implementation GroupBuilder
+ (NSArray *)groupsFromJSON:(NSData *)objectNotation error:(NSError **)error
{
    NSError *localError = nil;
    NSDictionary *parsedObject = [NSJSONSerialization JSONObjectWithData:objectNotation options:0 error:&localError];
    
    if (localError != nil) {
        *error = localError;
        return nil;
    }
    
    NSMutableArray *groups = [[NSMutableArray alloc] init];
    
    NSArray *results = [parsedObject valueForKey:@"results"];
    NSLog(@"Count %d", results.count);
    
    for (NSDictionary *groupDic in results) {
        Group *group = [[Group alloc] init];
        
        for (NSString *key in groupDic) {
            if ([group respondsToSelector:NSSelectorFromString(key)]) {
                [group setValue:[groupDic valueForKey:key] forKey:key];
            }
        }
        
        [groups addObject:group];
    }
    
    return groups;
}
@end

این متد برای تبدیل داده های خام JSON به یک آرایه از اشیاء Group طراحی شده است. پس از انتشار iOS 5 ، ساختار iOS SDK با یک کلاس به نام NSJSONSerialization  برای تجزیه کردن (parsing) داده های JSON همراه است. توسعه دهندگان می توانند از این کلاس برای تبدیل داده های JSON به اشیاء Foundation یا تبدیل اشیاء Foundation به داده های JSON استفاده کنند.

هنگام خواندن داده های JSON با استفاده از NSJSONSerialization ، تمام لیست های کلید شده به طور خودکار به اشیاء NSDictionary تبدیل می شوند. در مورد آرایه ها ، داده ها ، به نمونه های NSArray تبدیل می شوند. هر رشته ، در مواجه با نام آیتم های نامگذاری شده در لیست های کلید شده ، به NSString تبدیل می شوند ، در حالی که رشته های عددی به اشیاء NSNumber تبدیل می شوند. در نهایت ، هر مقدار null توسط NSNull نمایش داده می شود.

با مراجعه به پاسخ نمونه که در بخش قبل آن را نشان دادیم ، می توان فهیمد که Meetup API یک پاسخ JSON با دو بخش اصلی – نتایج (results) و متا (meta) – را باز می گرداند. ما فقط به بخش “results” نیاز خواهیم داشت.  این کد بسیار ساده است. ما یک حلقه loop از طریق results و نگاه به هر NSDictionary داخل آن ، ایجاد کرده ایم. در ادامه ، یک شیء Group ساخته و آن را از اطلاعات ضروری پر می کنیم ، سپس آن را به آرایه قابل تغییر اضافه می کنیم.

قرار دادن قطعات در کنار MeetupManager

اکنون ، باید نحوه کار با داده های JSON را بدانیم ، داده ها را تجزیه کرده و به اشیاء تبدیل می کنیم. در ادامه ، ما MeetupManager را پیاده سازی می کنیم که به عنوان یک هماهنگ کننده کلاس های زیر عمل می کند.

ابتدا ، یک فایل جدید با تمپلت پروتکل Objective-C ایجاد کرده و نام آن را MeetupManagerDelegate قرار می دهیم. کد زیر را به فایل MeetupManagerDelegate.h اضافه می کنیم:

@protocol MeetupManagerDelegate
- (void)didReceiveGroups:(NSArray *)groups;
- (void)fetchingGroupsFailedWithError:(NSError *)error;
@end

نماینده ، دو متد را اعلام می کند که توسط MeetupManager ، زمانی که گروه ها در دسترس هستند ، فراخوانی می شوند. متد اول ، زمانی که لیست گروه ها از Meetup تجزیه شده ، بازیابی می شود ، فراخوانی می گردد. در حالی که متد دوم ، در زمان بروز یک خطا ، فراخوانی می شود. MeetupManagerDelegate توسط MasterViewController  پیاده سازی می شود که در بخش بعد در مورد آن صحبت خواهیم کرد.

در ادامه ، یک فایل جدید با تمپلت کلاس Objective-C ایجاد کرده و نام آن را MeetupManager قرار می دهیم. سپس ، فایل header را باز کرده و کد زیر را به آن اضافه می کنیم:

#import 
#import 
 
#import "MeetupManagerDelegate.h"
#import "MeetupCommunicatorDelegate.h"
 
@class MeetupCommunicator;
 
@interface MeetupManager : NSObject
@property (strong, nonatomic) MeetupCommunicator *communicator;
@property (weak, nonatomic) id delegate;
 
- (void)fetchGroupsAtCoordinate:(CLLocationCoordinate2D)coordinate;
@end

همان طور که قبلاً گفتیم ، MeetupManager  به عنوان یک facade عمل می کند. کنترلر اپ می تواند با شیء model (یعنی Group) ایجاد شده ، کار کند ، بدون این که چیزی در مورد جزئیات اتصال شبکه ، واکشی/ تجزیه داده های JSON یا نحوه ایجاد اشیاء group بداند. چیزی که کنترلر نیاز دارد ، این است که فقط بداند از متد “fetchGroupsAtCoordinate:” برای واکشی گروه های Meetup استفاده می شود.

ما یک خصیصه برای نگهداری یک نمونه از communicator تنظیم می کنیم که بعداً در مورد آن صحبت خواهیم کرد و یک خصیصه دیگر را برای نگه داشتن اطلاعات ردیابی MeetupManagerDelegate تنظیم می کنیم. متد “”fetchGroupsAtCoordinate: توسط کنترلر برای واکشی گروه ها ، استفاده خواهد شد.

سپس ، فایل  MeetupManager.m را باز کرده و کد زیر را در آن قرار می دهیم:

#import "GroupBuilder.h"
#import "MeetupCommunicator.h"
 
@implementation MeetupManager
- (void)fetchGroupsAtCoordinate:(CLLocationCoordinate2D)coordinate
{
    [self.communicator searchGroupsAtCoordinate:coordinate];
}
 
#pragma mark - MeetupCommunicatorDelegate
 
- (void)receivedGroupsJSON:(NSData *)objectNotation
{
    NSError *error = nil;
    NSArray *groups = [GroupBuilder groupsFromJSON:objectNotation error:&error];
    
    if (error != nil) {
        [self.delegate fetchingGroupsFailedWithError:error];
        
    } else {
        [self.delegate didReceiveGroups:groups];
    }
}
 
- (void)fetchingGroupsFailedWithError:(NSError *)error
{
    [self.delegate fetchingGroupsFailedWithError:error];
}

 

در اینجا ، ما متد fetchGroupsAtCoordinate:coordinate را که گروه های موجود در یک ناحیه معین را با استفاده از متد searchGroupsAtCoordinate:coordinate  مربوط به communicator واکشی می کند ، پیاده سازی می کنیم. ما هم چنین ، متدهای MeetupCommunicatorDelegate  را برای هندل کردن نتایج فرمت شده JSON به عنوان نتایج بازیابی شده توسط communicator ، پیاده سازی می کنیم.

کد داخل متد اول پروتکلreceivedGroupsJSON:objectNotation ، از متد کلاس GroupBuilder برای تبدیل کردن نتیجه JSON به اشیاء Group استفاده می کند و سپس ، نماینده متد را از طریق اشیاء Group آگاه می سازد. اگر هر مشکلی در طول پردازش درخواست وجود داشته باشد ، ما متد دیگری را (یعنی fetchingGroupsFailedWithError:) از نماینده ، فراخوانی می کنیم تا به کنترلر اطلاع دهیم که یک مشکل رخ داده است.

نمایش دادن لیست گروه ها

اولین کاری که باید انجام دهیم این است که همه این کلاس ها را با هم هماهنگ کنیم ، به طوری که MeetupManager بتواند با آنها کار نماید. فایل MasterViewController.m را باز کرده و فایل header موردنیاز را import می کنیم ، رابط کاربری را به روز رسانی کرده و نمونه MeetupManager را به صورت زیر ، اعلام می کنیم:

#import "Group.h"
#import "MeetupManager.h"
#import "MeetupCommunicator.h"
 
@interface MasterViewController ()  {
    NSArray *_groups;
    MeetupManager *_manager;
}

بعداً ، ما متدهای تعریف شده در MeetupManagerDelegate را پیاده سازی خواهیم کرد. اما ، ابتدا اجازه دهید MeetupManager  را در متد viewDidLoad معرفی نماییم:

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    _manager = [[MeetupManager alloc] init];
    _manager.communicator = [[MeetupCommunicator alloc] init];
    _manager.communicator.delegate = _manager;
    _manager.delegate = self;
    
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(startFetchingGroups:)
                                                 name:@"kCLAuthorizationStatusAuthorized"
                                               object:nil];
}

ما یک manager جدید معرفی می کنیم ، سپس خصیصه communicator آن را با یک نمونه جدید پر می کنیم ، و در نهایت ، view controller جاری را برای نگه داشتن اطلاعات مربوط به ردیابی هر کدام از تغییرات ، آماده می کنیم. ناظر (observer) در اینجا ، پاسخ کاربر را هنگامی که هشدار مربوط به فعال کردن سرویس location نمایش داده می شود ، دریافت می کند ، تا متد startFetchingGroups: را برای شروع واکشی گروه ها از سرور ، فراخوانی کند.

سپس ، فایل “MasterViewController.m” را باز کرده و کد زیر را برای شروع عملیات واکشی ، در آن قرار می دهیم:

- (void)startFetchingGroups:(NSNotification *)notification
{
    [_manager fetchGroupsAtCoordinate:self.locationManager.location.coordinate];
}

view controller باید با پروتکل MeetupManagerDelegate سازگار باشد. این متد را مطابق کدهای زیر پیاده سازی می کنیم:

- (void)didReceiveGroups:(NSArray *)groups
{
    _groups = groups;
    [self.tableView reloadData];
}
 
- (void)fetchingGroupsFailedWithError:(NSError *)error
{
    NSLog(@"Error %@; %@", error, [error localizedDescription]);
}

متد “didReceiveGroups:” در هنگامی که اطلاعات گروه های Meetup از سرور Meetup به صورت یک آرایه نمونه برگشت داده شده ، دریافت می شوند ، فراخوانی خواهد شد. در اینجا ، ما به سادگی table view را برای نمایش دادن داده های جدید ، مجدداً لود می کنیم.

در نهایت ، متدهای table view را با چسباندن کدهای زیر ، تنظیم می کنیم:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _groups.count;
}
 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    DetailCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
 
    Group *group = _groups[indexPath.row];
    [cell.nameLabel setText:group.name];
    [cell.whoLabel setText:group.who];
    [cell.locationLabel setText:[NSString stringWithFormat:@"%@, %@", group.city, group.country]];
    [cell.descriptionLabel setText:group.description];
    
    return cell;
}

کدهای فوق ، بسیار ساده هستند. ما اطلاعات گروه ها را از آرایه فوق ، بازیابی کرده و سلول جدول را با این اطلاعات پر می کنیم.

کامپایل و اجرا نمودن اپ

اکنون زمان تست اپ فرا رسیده است. اپ را در شبیه ساز (یا اگر در برنامه iOS Developer ثبت نام کرده باشید می توانید از یک دستگاه iOS واقعی استفاده نمایید) کامپایل و اجرا می نماییم. موقعیت مکانی را به چیزی مانند London , UK تنظیم می کنیم. اپ ، باید اطلاعات گروه های نزدیک ما را مشابه تصویر زیر دریافت نماید:

نکته: اگر اطلاعاتی در مورد تست موقعیت مکانی در شبیه سازی iPhone ندارید ، می توانید آموزش Core Location را مطالعه نمایید.

خلاصه

ما در این آموزش ، بسیاری از جنبه های برنامه نویسی را با اتخاذ الگوی طراحی مناسب برای کار با داده های JSON ، پوشش دادیم. اکنون ، شما باید تجربه عملی در مورد واکشی و تجزیه کردن داده های JSON را کسب نموده باشید.

این آموزش ممکن است برای افرادی که در طراحی الگوها ، تازه کار هستند ، کمی پیچیده باشد. با این حال ، این امر باعث نمی شود که شما از استفاده از JSON در اپ خود ، بهراسید. iOS SDK باعث می شود که اپ ها به سادگی با JSON کار نمایند. به طور خلاصه ، کافی است شما یک اتصال URL ایجاد کنید ، داده های JSON را با استفاده از کلاس داخلی NSJSONSerialization  واکشی و تجزیه نمایید.

می توانید انواع API های رایگان را (مانند Kiva و TMDb) در اینترنت پیدا کنید. به عنوان تمرین ، سعی کنید API دیگری را انتخاب کنید و یک اپ دیگر برای آن API توسعه دهید. به طور مثال ، یک اپ ساده توسعه دهید و یک لیست از وام های fundraising اخیر را با استفاده از Kiva API نشان دهید.

فصلِ: 3 , تعداد قسمت ها: 179 , سطح: صفر تا صد

این فصل در یک نگاه:

در این دوره آموزشی ، برنامه نویسی اندروید و ios را با استفاده از زامارین خواهیم آموخت. همچنین به صورت کاملا پروژه محور ، اپلیکیشن فروشگاهی مشابه دیجی کالا را پیاده سازی خواهیم کرد. در انته…
فصلِ: 5 , تعداد قسمت ها: 221 , سطح: صفر تا صد
موضوعات: آموزش IOS

این فصل در یک نگاه:

در این فصل:-نمایش notification به کاربر زمانی که اتفاقاتی از قبیل لایک کردن پست و ... میافتد(این مبحث مبحثی مهم بوده و ج…

  توضیحات کلی دوره: با سلام خوش اومدین به حرفه ای ترین دوره ی Swift ابتدای کار ممکن است سوالی برای شما پیش آید: -من نیازی به ساخت اپلیکیشن اجتماعی ندارم چرا باید این دوره را ببینم؟ ج…
فصلِ: 7 , تعداد قسمت ها: 159 , سطح: صفر تا صد
موضوعات: آموزش IOS

این فصل در یک نگاه:

اپل نویس حرفه ای شوید... با این پکیج کسب درآمد میلیونی کنید....   در این پکیج به نکات ریز و درشت زیادی پرداختیم که خیلی خیلی میتونه به شما کمک کنه که تبدیل به برنامه نویس حرفه ای شوید... …
فصلِ: 12 , تعداد قسمت ها: 126 , سطح: صفر تا صد
موضوعات: آموزش IOS

این فصل در یک نگاه:

فصل 16 فصل آخرمون هست و میایم توی این فصل یه سری مباحث کوچیکی که جامونده و کارهای نهایی برای انتشار برنامه توی مایکت های…

با سلام نکته:هیچ نیازی به mac و یا iphone نیست... نکته:هیچ نیازی به بلد بودن برنامه نویسی از قبل نیست... مباحثی که توی این دوره مرور میکنیم میتونه ما رو از سطح صفر برنامه نویسی ios به صد …
فصلِ: 6 , تعداد قسمت ها: 194 , سطح: صفر تا صد

این فصل در یک نگاه:

در این فصل آپدیت های مربوط به دوره را قرار میدهیم…

با سلام و خسته نباشد خدمت کلیک سایتی های عزیز در ادامه با توضیحات مختصری درمورد دوره ی react native با ما همراه باشید: React Native چیست؟ قطعا یکی از آرزوهای برنامه نویسان این میباشد که ب…
فصلِ: 5 , تعداد قسمت ها: 51 , سطح: صفر تا صد

این فصل در یک نگاه:

اموزش پرداخت درون برنامه ای بازار در یونیتی-اموزش خرید سکه در بازی-اموزش خرید مصرفی و غیر مصرفی…

توضیحات کلی مجموعه: آموزش مقدماتی تا پیشرفته یونیتی(ساخت بازی توپ چرخنده-اموزش بازی دوبعدی-اموزش بازی سه بعدی اول شخص شوتر-اموزش بازی سه بعدی رالی (ماشین سواری))   سرفصلهای دوره: نصب ی…
فصلِ: 2 , تعداد قسمت ها: 68 , سطح: صفر تا صد

این فصل در یک نگاه:

آموزش ساخت یک فروشگاه کوچک-آموزش کار با bottom navigation -آموزش کار با تب بار-آموزش کار با scrollview - آموزش کار با ان…

توضیحات کلی مجموعه: آموزش دوره فلاتر از پایه تا پیشرفته(این دوره به دوره متخصص فلاتر تغییر پیدا کرد) درسال های گذشته تعدا زیادی فریمورک معرفی شد که هرکدام تجربه خاص خودش رو داشت،اما فلاتر …
فصلِ: 5 , تعداد قسمت ها: 25 , سطح: صفر تا صد

این فصل در یک نگاه:

فصل پنجم…

توضیحات کلی مجموعه: درباره گیت: لذت پیش بردن پروژه های برنامه نویسی خود را با بهترین ورژن کنترل سیستم جهان تجربه کنید کامل ترین دوره ی آموزشی گیت و گیت هاب به همراه مثال های کاربردی گی…

تولید شده توسط کلیک سایت

پشتیبانی آنلاین
آماده پاسخگویی هستیم
انتخاب تصویر جهت ارسال:
در حال ضبط صدا

(جهت توقف و یا لغو ضبط از دکمه های زیر استفاده کنید)

توقف و ارسال :
لغو ضبط
در حال حاضر تمامی کارشناسان آفلاین هستند. همواره می توانید با شماره تلگرام / واتساپ 09010005000 به صورت آنلاین با ما در ارتباط باشید. جهت ورود به واتساپ کلیک کنید
0 پیام جدید
پشتیبان در حال تایپ ...
ارسال تصویر ضبط صدا
0 کارشناسان آنلاین می باشند
این گفت و گو توسط پشتیبان به اتمام رسید