2016-12-14 4 views
0

Ich versuche, ein Singleton zur Verwaltung NSURLSession Anfrage zu implementieren. Hier ist mein Code:NSURLSession Mitglied Referenztyp Struct Objc_class ist ein Zeiger

Header-Datei:

@interface httpRequest : NSObject 

@property (strong,nonatomic) NSURLSession *session; 

+(httpRequest*)request; 

Implementierungsdatei (.m):

+(httpRequest*)request 
{ 
    static httpRequest *shareObject = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once (&onceToken, ^{ 
     shareObject = [[self alloc] init]; 
     self.session = [NSURLSession sharedSession]; 
    }); 
    return shareObject; 
} 

Aber in dieser Zeile:

self.session = [NSURLSession sharedSession]; 

Ich erhalte diese Fehler: "NSURLSession-Member-Referenztyp struct objc_class ist ein Zeiger, den Sie verwenden möchten ->"

enter image description here Warum bekomme ich Fehler ?, jeder von euch kennt einen Weg um dies?

+1

völlig unabhängig, könnte man folgende Cocoa Namenskonventionen berücksichtigen, wobei Klassennamen beginnen mit einem Großbuchstaben (zB 'HTTPRequest' oder' HttpRequest'). Es ist nur eine Konvention, aber es macht den Code ein wenig leichter zu lesen. Und, noch weiter entfernend, bin ich mir nicht sicher, ob ich 'Request' im Namen überhaupt verwenden würde, weil" request "normalerweise mit einer bestimmten' NSURLSessionTask' (einer bestimmten Anfrage von einem Web-Service) verbunden ist, nicht mit der 'NSURSession' selbst. Ich könnte es daher "HTTPManager" oder etwas ähnliches nennen, um die Namenskonflikte bei der Anfrage/Sitzung zu vermeiden ... – Rob

Antwort

2

Der übliche Weg ist die init Methode

+(httpRequest*)request 
{ 
    static httpRequest *shareObject = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once (&onceToken, ^{ 
     shareObject = [[self alloc] init]; 
    }); 
    return shareObject; 
} 


- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     self.session = [NSURLSession sharedSession]; 
     } 
    } 
    return self; 
} 

zu verwenden, aber da sharedObjectself ist eigentlich das soll auch arbeiten

+(httpRequest*)request 
{ 
    static httpRequest *shareObject = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once (&onceToken, ^{ 
     shareObject = [[self alloc] init]; 
     shareObject.session = [NSURLSession sharedSession]; 
    }); 
    return shareObject; 
} 
0

In einer Klassenmethode (die mit + beginnt), bezieht sich self auf die Klasse, nicht auf die Instanz. Ich denke, du beabsichtigst shareObject.session. Persönlich würde ich die Einstellung der session auf die init Methode verschieben (in diesem Fall würden Sie die self.session Syntax verwenden).

Oder in Objective-C können Sie jetzt class Eigenschaften definieren (für Swifter Interoperabilität entworfen). Aber da Sie nur eine httpRequest haben, ist das Overkill.