цель c — чистый эквивалент C ++ для NSURLConnection и NSURLRequest

Я портирую игру, используя родной C ++ для Android. Мне нужно знать, какой метод я должен использовать для достижения той же функциональности, что и NSURLConnection а также NSURLRequest только в C ++. Также, как получить все следующие функции делегатов, реализованные для C ++.

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

Пожалуйста, порекомендуйте.

0

Решение

Нет способа реализовать Objective-C делегировать методы в C++ непосредственно. Лучшее, что вы действительно можете надеяться сделать, это использовать Objective-C++ сделать C++ объект с переменной экземпляра, который является объектом Objective C, единственной целью которого является NSURLConnection делегировать и пересылать эти вызовы методов владельцам C++ объект. C++ объект должен владеть / сохранять Objective-C и нести ответственность за его подключение в качестве делегата NSURLConnection объект.

очень Наивная реализация описанного выше шаблона может выглядеть так:

URLConnection.h

#ifndef __Cplusplus__URLConnection__
#define __Cplusplus__URLConnection__

#include <string>

class URLConnection
{
public:
URLConnection(std::string url);
~URLConnection();

void DidReceiveResponse(const void* response);
void DidReceiveData(const void* data);
void DidFailWithError(std::string error);
void DidFinishLoading();

void* mNSURLConnection;
void* mDelegate;
};

#endif /* defined(__Cplusplus__URLConnection__) */

URLConnection.mm

#include "URLConnection.h"
@interface PrivateNSURLConnectionDelegate : NSObject <NSURLConnectionDelegate>
{
URLConnection* mParent;
}
- (id)initWithParent: (URLConnection*) parent;
@end

@implementation PrivateNSURLConnectionDelegate

- (id)initWithParent: (URLConnection*) parent
{
if (self = [super init])
{
mParent = parent;
}
return self;
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
mParent->DidReceiveResponse(response);
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
mParent->DidReceiveResponse(data.bytes);
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
mParent->DidFailWithError(std::string([[error description]UTF8String]));
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
mParent->DidFinishLoading();
}

@endURLConnection::URLConnection(std::string url)
{
this->mDelegate = [[PrivateNSURLConnectionDelegate alloc] initWithParent: this];
NSURLRequest* req = [NSURLRequest requestWithURL: [NSURL URLWithString: [NSString stringWithUTF8String: url.c_str()]]];
this->mNSURLConnection = [[NSURLConnection alloc] initWithRequest: req delegate: (id)this->mDelegate];
}

URLConnection::~URLConnection()
{
[(NSObject*)this->mNSURLConnection release];
[(NSObject*)this->mDelegate release];
}

void URLConnection::DidReceiveResponse(const void* response)
{
// Do something...
}
void URLConnection::DidReceiveData(const void* data)
{
// Do something...

}
void URLConnection::DidFailWithError(std::string error)
{
// Do something...
}

void URLConnection::DidFinishLoading()
{
// Do something...
}

В конце дня, NSURLConnection является Objective-C объект. Там нет способа взаимодействовать с ним без использования Objective-C,

1

Другие решения

LibCURL, пожалуй, самая известная библиотека для кроссплатформенной реализации C / C ++ для обработки сетевых / интернет-соединений. Если вы объедините это с асинхронной технологией, такой как потоки, вы можете начать симулировать NSURLConnection.

Посмотреть здесь [https://curl.haxx.se/libcurl/c/multithread.html] для примера. Вам нужно будет создать класс, который управляет ссылкой CURL и соответствующим делегатом std :: function, который вы будете вызывать, когда соединение завершается / ошибки / прерывается и т. Д. При его использовании вы можете передавать лямбда-функции C ++ 14 в выступать в качестве заместителей для делегатов Цели C.

0

По вопросам рекламы [email protected]