swift 언어 학습 노트 11 (performSelector)
원본 주소: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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 다 중 스 레 드 메커니즘 의 스 레 드 생 성target 을 실행 대상 으로 지정 한 name 을 이름 으로 하고 group 에서 참조 하 는 스 레 드 그룹의 일원 으로 새 Thread 대상 을 할당 합 니 다. 이 스 레 드 가 독립 된 Runnable 실...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.