answer

2019-03-20 14:29:49 浏览数 (1)

  1. Q:在做opengl es绘制3d图形的时候,绘制POIt标题的时候,不知道如何绘制 A:后来经过大量查询和实践,发现要以纹理的形式绘制上去,那个时候就先把文字生成图片,然后再以纹理形式绘制,期间再写了texture的glsl语言,后来跟3d图形一起绘制的时候,经过缩放,旋转等操作,发现标题纹理的变换情况有问题,原来是有投影和摄像机两个矩阵,后又经过大量实践和查询,给纹理单独又加了个模型矩阵,所以最终实现是投影,摄像机,模型三个矩阵,不像绘制图形j只用了2个矩阵。

2.跟我预想中不一样,我这边特地用swift和oc分别敲了一遍,oc的时候array2中只有obj2并且name为test,而swift中,array2依然是obj1,obj2,但obj2的name却变为了test,这个在oc中能理解,在swift中目前还没有理解,不过这是我要理解的目标了。

swift:

代码语言:javascript复制
class Object {
            var name = "name"
            init(name : String) {
                self.name = name
            }
        }
        
        let obj1 = Object(name: "hello")
        let obj2 = Object(name: "world")
        
        var arr1 = [obj1,obj2]
        var arr2 = arr1
        
        arr1.remove(at: 0)
        arr1[0].name = "test"
        
        print(arr2)

oc:

代码语言:javascript复制
Person *p1 = [[Person alloc]init];
    p1.name = @"h";
    Person *p2 = [[Person alloc]init];
    p2.name = @"w";
    
    NSMutableArray *a1 = [[NSMutableArray alloc]initWithArray:@[p1,p2]];
    NSArray *a2 = a1;
    
    [a1 removeObjectAtIndex:0];
    Person *p = a1[0];
    p.name = @"t";
    
    NSLog(@"%@",a2);

使用gcd的group或是信号量都能满足需求,https://cloud.tencent.com/developer/article/1117086这是oc的方式

swift如下:

group

代码语言:javascript复制
let group = DispatchGroup()
        
        group.enter()
        //网络请求
        //完成回调里
        group.leave()
        
        group.enter()
        //网络请求
        //完成回调里
        group.leave()
        
        group.enter()
        //网络请求
        //完成回调里
        group.leave()
        
        //最后
        group.notify(queue: .main) {
            //UI更新
        }

semaphore

代码语言:javascript复制
let sem = DispatchSemaphore(value: 0)
        
        var count = 0
        
        //网络请求
        //完成回调里
        count  = 1
        //如果count=3了的话
        sem.signal()
        
        //网络请求
        //完成回调里
        count  = 1
        //如果count=3了的话
        sem.signal()
        
        //网络请求
        //完成回调里
        count  = 1
        //如果count=3了的话
        sem.signal()
        
        sem.wait()
        //这个注意不要放在主线程,会阻塞, 信号量本质就是0阻塞,大于0继续执行

代码语言:javascript复制
func showActionSheet(title:String,msg:String,btns:[String]) {
     
        let alert = UIAlertController(title: title, message: msg, preferredStyle: .actionSheet)
        
        for btn in btns {
            
            let action = UIAlertAction(title: btn, style: .default) { (void) in
                
                //这里是事件,由于刚刚已写了for in循环,拿不到index,这样可能做起来稍麻烦点
                //1.匹配字符串  2.记录一个外部变量,进来 1,知道index
                //当然用另外一种for循环会好很多
                
//                主要是要确定点的是哪个事件,最好由这里传递出去,index,用户知道i自己定义时传的btns,用Index确定用哪个事件
                
            }
            
            alert.addAction(action)
            
        }
        
        //再给个取消事件
        let cancelAction = UIAlertAction(title: "取消", style: .cancel) { (void) in
            
        }
        alert.addAction(cancelAction)
        
        self.present(alert, animated: true, completion: nil)
        
        
    }
    
    
    //在这里做点击事件处理
    func actionSheetAction(index:Int) {
        if index==0 {
            
        }else if index==1 {
            
        }
        
    }

0 人点赞