Halten Blöcken im Wörterbuch
Habe ich meine eigene Methode, die einen block als argument. Ich will zu verfolgen, block in ein NSDictionary. Was ist der beste Weg, um den block mit dem Wörterbuch?
Ich versuchte diesen code, aber nach dem ausführen der Zeile darunter (setObject...) das Wörterbuch ist noch leer. Ich vermute, dass es ist, weil der block nicht der Typ NSObject. Aber was ist der richtige Weg, dies zu tun?
- (void)startSomething:(NSURLRequest*)request block:(void (^)(NSURLResponse*, NSData*, NSError*))handler {
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[pendingRequests setObject:handler forKey:connection];
}
EDIT:
Nie Verstand. Ich weiß nicht, was ich dachte. 3 Punkte:
- Blöcke sind objc von Objekten
- Typo: setObject sollte setValue
- forKey ist ein string, so sollte es sein [Verbindung Beschreibung] oder so etwas wie, dass
Jedenfalls habe ich behoben, mein problem jetzt:
- (void)startSomething:(NSURLRequest*)request block:(void (^)(NSURLResponse*, NSData*, NSError*))handler {
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[pendingRequests setValue:handler forKey:[connection description]];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
void (^handler)(NSURLResponse*, NSData*, NSError*);
handler = [pendingRequests valueForKey:[connection description]];
handler(nil, nil, nil);
});
}
InformationsquelleAutor der Frage vgr | 2011-06-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das immer noch nicht zur Arbeit zu gehen oder, am besten, funktioniert nur zufällig.
Müssen Sie kopieren die
handler
vor schob es in das Wörterbuch. So etwas wie:Und, ja, es sollte
setObject:forKey:
undobjectForKey:
.InformationsquelleAutor der Antwort bbum
Wenn Sie mit ARC haben, verwenden Sie
-copy
:InformationsquelleAutor der Antwort Johan Kool
"Typo: setObject sollte setValue"
NEIN, sollten Sie immer
setObject:
stattsetValue:
.setValue:
ist für Schlüssel-Wert-Codierung und zufällig funktioniert ähnlich wiesetObject:
für ein Wörterbuch (selbst dann ist es nicht das gleiche, wenn z.B. der Schlüssel ist"@something"
), währendsetObject:
ist die richtige Methode für die Dinge in ein Wörterbuch, und die richtig nimmt alle Typen als Schlüssel. (By the way ich bin nicht sicher, dass Sie verwenden möchtenconnection
wie ein Schlüssel, da es zu kopieren.)Das eigentliche problem ist, dass die Blöcke kopiert werden müssen, bevor Sie speichern Sie Weg in etwas, das vielleicht länger als der ursprüngliche Bereich des Blocks (dies ist ein besonderes Problem für Blöcke und nicht für andere Objekte), da die Blöcke (im Gegensatz zu anderen Objekten), werden zunächst auf dem stack, wodurch es nicht verhindern, dass es immer ausgeplant. Wenn man etwas in einem Wörterbuch normalerweise behält es, aber das ist in diesem Fall nicht genug.
InformationsquelleAutor der Antwort newacct
Eigentlich mit ARC können Sie einfach fügen Sie den block mit dem NSDictionary als würden Sie mit jedem anderen Objekt. Sie brauchen nicht, etwas besonderes zu tun wie Block_copy oder [block kopieren], und das tun, das wäre falsch und verursacht ein Leck.
InformationsquelleAutor der Antwort Binks