Инкапсуляция - ваш друг в этом случае.Когда я использую внешние / сторонние API, мне нравится создавать собственный класс-оболочку для данных.Допустим, вы заботитесь только о «fbID» и «userName».Создайте собственный класс для хранения этих данных после их получения (частные переменные с геттерами и 1 или более сеттерами).Немного скелетного кода:
class MyUserClass{
//declare vars here (_fbID, _userName)
public function setData(userID:String, userName:String):void{
//set the values here.
}
//getters here (get fbID, get userName)
}
Вы можете использовать 2 функции сеттера, если хотите, но дело в том, что вы сможете вызывать их с любыми данными, которые захотите.Когда все ваше приложение получает эту информацию из вашего класса, а не API, вы можете работать в автономном режиме.В автономном режиме вы можете подключить некоторые совместимые «фальшивые» данные, чтобы они работали.
Теперь вам нужно перейти на следующий уровень, создавая тип обертки для каждого звонка в Facebook.Под этим я подразумеваю то, что, поскольку вы знаете, чего ожидать от fb, вы можете притвориться, что действительно его получили, и продолжить.Запрашивая список идентификаторов друзей?составьте поддельный список, который является разумным, и пусть ваше приложение использует его.Еще лучше: сгенерируйте столько фальшивых офлайн-пользователей, сколько захотите, и сделайте так, чтобы ваши вызовы на сервере задерживали случайное время задержки перед возвратом фальшивых данных в прослушиватель событий.Это также поможет проверить возможные условия гонки.
Один из способов сделать это - создать и расширить класс для выполнения вызовов API.Наслаждайтесь.
import flash.events.EventDispatcher;
import flash.events.Event;
import flash.events.TimerEvent;
import flash.utils.Timer;
class MyApiCaller extends EventDispatcher{
//set up vars to hold call result data
protected var _someData:String;
//make sure to declare some event types for the callbacks
public static const SERVERCALL1_COMPLETE:String = "servercall1_complete";
function MyApiCaller(){
//init things....
}
public function doServerCall1(...args:*):void {
//create the ulrLoader etc...
//set up event listener to onServerCall1Complete
}
public function onServerCall1Complete(event:Event):void {
//parse results, save to vars
//fire event to notify the caller
dispatchEvent(new Event(SERVERCALL1_COMPLETE));
}
//getter to be used when the waiting object gets the SERVERCALL1_COMPLETE event
public function get someData():String {return _someData;}
}
class MyFakeApiCaller extends MyApiCaller{
//set up any additional types (random user data etc..) that would not be found in the base class
//no need to redeclare the event types
function MyFakeApiCaller(){
//init things....
}
override public function doServerCall1(...args:*):void {
//wait a random amount of time via Timer, set up event listener to onServerCall1Complete
}
override public function onServerCall1Complete(event:Event):void {
//event is a TimerEvent in this case
//generate data / choose random data
//save to vars: _someData = ...
//fire event to notify the caller
dispatchEvent(new Event(MyApiCaller.SERVERCALL1_COMPLETE));
}
//getter from base class will be used as usual
}