2016-02-23 2 views
0

Я пытался Swizzle NSURLSession метод класса dataTaskWithRequest, но не был в состоянии сделать этоКак Swizzle NSURLSession метод класса dataTaskWithUrl

extension NSURLSession{ 
public override class func initialize() { 
    struct Static { 
     static var token: dispatch_once_t = 0 
    } 

    if self !== NSURLSession.self { 
     return 
    } 

    dispatch_once(&Static.token) { 
     let originalSelector = Selector("dataTaskWithRequest:completionHandler:") 
     let swizzledSelector = Selector("my_dataTaskWithRequest:completionHandler:") 

     let originalMethod = class_getInstanceMethod(self, originalSelector) 
     let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) 

     let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) 

     if didAddMethod { 
      class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)) 
     } else { 
      method_exchangeImplementations(originalMethod, swizzledMethod) 
     } 
    } 
} 

// Swizzled Method 
func my_dataTaskWithRequest(request: NSURLRequest,completionHandler: (NSData?, NSURLResponse?, NSError?)) -> NSURLSessionDataTask { 

    print("Inside Swizzled Method") 

    return my_dataTaskWithRequest(request,completionHandler: completionHandler) 
} 
} 

Спасибо заранее !!

+0

Вы уверены, ваш 'initialize' на самом деле называется? В любом случае, вы должны реализовать 'load', а не переопределять' initialize'. [См. Этот вопрос для деталей.] (Http://stackoverflow.com/questions/13326435/nsobject-load-and-initialize-what-do-they-do). – DarkDust

ответ

0

Мне пришлось загрузить мои данные в формате JSON (или NSDictionary) на сервер.
я сделал что-то вроде этого ...

let urlPath:String = apiURL + apiVersion + url + "?api_key=" + apiKey 
// OR 
let urlPath:String = "your url string" 
let url = NSURL(string: urlPath) 
let session = NSURLSession.sharedSession() 

let task = session.dataTaskWithURL(url!, completionHandler: {(data, reponse, error) in 
println("Task completed") 
// rest of the function... 
}) 

task.resume() 


Для более или относительного ответа визита ссылки
How to swizzle in private method

Я надеюсь, что это может помочь вам

+1

Этот вопрос помечен тегом [tag: swift]. Зачем вам давать ответ в Objective-C? – JAL

+0

Я думаю, это может дать вам идею ... как решить вашу проблему. У меня был готовый код/​​решение из моего предыдущего проекта. Вы можете преобразовать в быстрый. –

+0

Привет. Вопрос помечен как «быстрый», пожалуйста, укажите ответ в Swift, а не на другом языке. Благодаря! – Moritz

-1
// i hope it may be help you 
    extension NSURLSession{ 
    public override class func initialize() { 
    struct Static { 
     static var token: dispatch_once_t = 0 
    } 

    if self !== NSURLSession.self { 
     return 
    } 

    dispatch_once(&Static.token) { 
let method1: Method = class_getInstanceMethod(self,Selector("dataTaskWithRequest:completionHandler:")); 
let method2 = class_getInstanceMethod(self, Selector("my_dataTaskWithRequest:completionHandler:")); 
    method_exchangeImplementations(method1, method2); 
} 
} 
// Swizzled Method 
func my_dataTaskWithRequest(request: NSURLRequest,completionHandler: (NSData?, NSURLResponse?, NSError?)) -> NSURLSessionDataTask { 

print("Inside Swizzled Method") 

return my_dataTaskWithRequest(request,completionHandler: completionHandler) 
} 
} 
+0

Это не работает для меня, так как вы не сделали ничего другого в своем ответе, просто изменили способ написания селекторов @Andey –

+0

Я хочу использовать метод swizzle в URLSession, но не смог достичь. Не могли бы вы мне помочь. –

Смежные вопросы