swift 언어 학습 노트 11 (performSelector)

저자: fengsh 998
원본 주소:http://blog.csdn.net/fengsh998/article/details/35842441
전재 출처 를 밝 혀 주 십시오
만약 글 이 당신 에 게 도움 이 된다 고 생각한다 면, 댓 글 을 남기 거나 위 챗 공식 계 정 fengsh 998 에 관심 을 가지 고 저 를 지지 해 주 십시오. 감사합니다!
OC 에 서 는 퍼 포 먼 스 셀 렉 터 를 잘 사용 하 는데 왜 swift 에서 의도 적 으로 빠 졌 는 지 모 르 겠 습 니 다.더 심 한 경우 IMP, obbcmsg Send 도 못 써 요.왜 그런 지 모 르 겠 지만 일리 가 있 을 거 야.고민 안 할 게 요.
OC 에서 더 많이 사용 할 수 있 는 것 은 지연 처리, 배경 처리, 스 레 드 비동기 등 입 니 다.지금 은 performSelector 가 없 는데 swift 에서 대체 할 수 있 는 것 이 어디 있 습 니까? 당연히 있 습 니 다. 예 를 들 어 GCD, NSTimer 는 모두 비슷 하 게 대체 할 수 있 습 니 다.
NSTimer 
let tm = NSTimer(timeInterval: 3.0, target: self, selector: "selectorfunc:", userInfo: nil, repeats: false)
        tm.fire()

그러나 개인 적 으로 NSTimer 가 컨 텍스트 를 전달 할 때 permSelector 와 다 르 게 가 져 옵 니 다.컨 텍스트 에서 NSTimer 를 받 으 려 면 userInfo 를 다시 가 져 와 야 합 니 다.그러나 어쨌든 지연 처 리 는 가능 하 다.
또한, 나 는 swift 의 확장 류 (OC 의 catagray) 를 만 들 었 고, 마찬가지 로 performselector 방법 을 위장 했다.왜 위장 이 라 고 하 는 지, 그 과정 에서 최종 selector 를 호출 할 때 스 레 드 로 처 리 했 기 때 문 입 니 다.이상 적 인 msgSend 방식 이 아 닙 니 다.
실현:
//
//  ExpandNSObject.swift
//  MixDemo
//
//  Created by apple on 14-6-29.
//  Copyright (c) 2014  fengsh. All rights reserved.
//

import Foundation

extension NSObject
{
    func performSelectorOnMainThread(selector aSelector: Selector,withObject object:AnyObject! ,waitUntilDone wait:Bool)
    {
        if self.respondsToSelector(aSelector)
        {
            var continuego = false
            let group = dispatch_group_create()
            let queue = dispatch_queue_create("com.fsh.dispatch", nil)
            dispatch_group_async(group,queue,{
                dispatch_async(queue ,{
                    //     
                    NSThread.detachNewThreadSelector(aSelector, toTarget:self, withObject: object)
                    continuego = true
                })
                })
            dispatch_group_wait(group, DISPATCH_TIME_FOREVER)

            if wait
            {
                let ret = NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate.distantFuture() as NSDate)
                while (!continuego && ret)
                {
                    
                }
            }
        }
    }
    
    func performSelector(selector aSelector: Selector, object anArgument: AnyObject! ,delay afterDelay:NSTimeInterval)
    {
        if self.respondsToSelector(aSelector)
        {
            let minseconds = afterDelay * Double(NSEC_PER_SEC)
            let dtime = dispatch_time(DISPATCH_TIME_NOW, Int64(minseconds))

            dispatch_after(dtime,dispatch_get_current_queue() , {
                //     
                NSThread.detachNewThreadSelector(aSelector, toTarget:self, withObject: anArgument)
                })
        }
    }
}

테스트 사용:
        self.performSelector(selector:"refreshTable:", object:nil ,delay:3.0)
        self.performSelectorOnMainThread(selector:"refreshTable:", withObject:nil,waitUntilDone:true)
performSelector 를 사용 하여 최종 적 으로 실 행 된 selector 가 하위 스 레 드 에 있 으 면 selector 에서 UI 를 업데이트 하 는 작업 이 있 으 면 주 스 레 드 로 돌아 가 야 한다 고 경고 합 니 다.이 정도 로 위장 을 잘 하지 못 해서 정말 실패했어...
여러분 은 종 류 를 사용 한 적 이 있 으 니 조심 하 세 요.감사합니다.
swift 원본 파일 위 치 를 첨부 하지 마 십시오:http://download.csdn.net/detail/fengsh998/7569569

좋은 웹페이지 즐겨찾기