Вы рассмотрели рассмотрение реализации NSCoding
Протокол? Это позволит Вам, кодируют и декодируют на iPhone с двумя простыми методами, которые реализованы с NSCoding
. Сначала Вам было бы нужно к добавлению NSCoding
к Вашему Классу.
Вот пример:
Это находится в.h файле
@interface GameContent : NSObject <NSCoding>
Затем, необходимо будет реализовать два метода Протокола NSCoding.
- (id) initWithCoder: (NSCoder *)coder
{
if (self = [super init])
{
[self setFoundHotSpots:[coder decodeObjectForKey:@"foundHotSpots"]];
}
return self;
}
- (void) encodeWithCoder: (NSCoder *)coder
{
[coder encodeObject:foundHotSpots forKey:@"foundHotSpots"];
}
Выезд документация относительно NSCoder для получения дополнительной информации. Это натолкнулось действительно удобное на мои проекты, где я должен сохранить состояние приложения на iPhone, если приложение закрывается, и восстановите его назад к, он - состояние когда его спина на.
ключ должен добавить протокол к интерфейсу и затем реализовать два метода, которые являются частью NSCoding
.
я надеюсь, что это помогает!
По большей части время тратится на настройку и отключение WCF. канал. Другая львиная доля времени, похоже, тратится на работу в отладчике. Имейте в виду, что это действительно неформальное тестирование типов .. :)
Мне удалось воспроизвести ваши числа, поэтому я начал с этого. Это показало, что номера WCF примерно в 3 раза больше, чем номера удаленного взаимодействия.
При кэшировании фабрики каналов (и соответствующих объектов удаленного взаимодействия) числа упали, так что WCF был только в 2 раза больше, чем ] номера удаленного доступа.
После проверки дюжины других различных настроек, единственное, что, казалось, сократило сколько-нибудь реально измеримое время с цифр, - это очистить все поведение службы отладки (добавлено по умолчанию) - это дало примерно ~ 100 мс. Недостаточно, чтобы по-настоящему волноваться.
Затем, по прихоти, я запустил код вне отладчика в конфигурации выпуска . Числа упали до , что примерно эквивалентно количеству удаленного доступа, если не лучше . Лоб ударил по столу и объявил, что все готово.
Вкратце, вы должны увидеть примерно то же самое, с возможностью повышения производительности с помощью WCF и получения лучшей модели программирования для загрузки.
remoting 1 test run in 347ms
wcf 1 test run in 1544ms
remoting 2 test run in 493ms
wcf 2 test run in 324ms
remoting 3 test run in 497ms
wcf 3 test run in 336ms
remoting 4 test run in 449ms
wcf 4 test run in 289ms
remoting 5 test run in 448ms
wcf 5 test run in 284ms
remoting 6 test run in 447ms
wcf 6 test run in 282ms
remoting 7 test run in 439ms
wcf 7 test run in 281ms
remoting 8 test run in 441ms
wcf 8 test run in 278ms
remoting 9 test run in 441ms
wcf 9 test run in 278ms
remoting 10 test run in 438ms
wcf 10 test run in 286ms
Примечание - этот код был полностью подделан. Я прошу прощения. : )
using System;
using System.ServiceModel;
using System.Runtime.Serialization;
[ServiceContract]
interface IWorkerObject
{
[OperationContract]
Outcome DoWork(Input t);
}
[DataContract]
[Serializable]
class Input
{
[DataMember]
public int TaskId { get; set; }
[DataMember]
public int ParentTaskId { get; set; }
[DataMember]
public DateTime DateCreated { get; set; }
[DataMember]
public string TextData { get; set; }
[DataMember]
public byte[] BinaryData { get; set; }
}
[DataContract]
[Serializable]
class Outcome
{
[DataMember]
public string Result { get; set; }
[DataMember]
public string TextData { get; set; }
[DataMember]
public byte[] BinaryData { get; set; }
}
class Program
{
static AppDomain dom = AppDomain.CreateDomain("wcf domain", null);
static WorkerObject dcnt = dom.CreateInstanceFromAndUnwrap(System.Reflection.Assembly.GetExecutingAssembly().Location, typeof(WorkerObject).FullName) as WorkerObject;
static ChannelFactory<IWorkerObject> fact = new ChannelFactory<IWorkerObject>(new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), "net.pipe://localhost/the_channel");
static IWorkerObject chan = fact.CreateChannel();
static AppDomain remdom = AppDomain.CreateDomain("remoting domain", null);
static IWorkerObject remoteObject;
static void Main(string[] args)
{
remoteObject = remdom.CreateInstanceFromAndUnwrap(System.Reflection.Assembly.GetExecutingAssembly().Location, typeof(WorkerObject).FullName) as IWorkerObject;
dcnt.OpenChannel();
int numberOfIterations = 10;
for (int i = 1; i <= numberOfIterations; i++)
{
run_rem_test(i);
run_wcf_test(i);
}
fact.Close();
dcnt.CloseChannel();
AppDomain.Unload(dom);
AppDomain.Unload(remdom);
}
static void run_rem_test(int iteration)
{
RunTest("remoting " + iteration, remoteObject);
}
static void run_wcf_test(int iteration)
{
RunTest("wcf " + iteration, chan);
}
static void RunTest(string test, IWorkerObject dom)
{
var t = new Input()
{
TextData = new string('a', 8192),
BinaryData = null,
DateCreated = DateTime.Now,
TaskId = 12345,
ParentTaskId = 12344,
};
var sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0; i < 1000; i++)
dom.DoWork(t);
sw.Stop();
Console.WriteLine("{1} test run in {0}ms", sw.ElapsedMilliseconds, test);
}
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class WorkerObject : MarshalByRefObject, IWorkerObject
{
ServiceHost m_host;
public void OpenChannel()
{
m_host = new ServiceHost(typeof(WorkerObject));
m_host.AddServiceEndpoint(typeof(IWorkerObject), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), "net.pipe://localhost/the_channel");
// cache our ServiceBehaviorAttribute, clear all other behaviors (mainly debug)
// and add our ServiceBehavior back
//
var b = m_host.Description.Behaviors[0] as ServiceBehaviorAttribute;
m_host.Description.Behaviors.Clear();
m_host.Description.Behaviors.Add(b);
m_host.Open();
}
public void CloseChannel()
{
m_host.Close();
}
public Outcome DoWork(Input t)
{
return new Outcome()
{
TextData = new string('b', 8192),
BinaryData = new byte[1024],
Result = "the result",
};
}
}