2013-08-24 59 views
0

我對Objective-C非常陌生。嘗試設置TextView的值時,OSX應用程序會凍結嗎?

首先請查看代碼:

這是屬性:

@property (atomic) IBOutlet NSTextView *txtResponse; 

,就是這樣的動作:

- (IBAction)sendReq:(id)sender { 
    @synchronized(self) 
    { 
     request *req = [[request alloc] init]; 

     voidCallback callback = ^(NSURLResponse *resp, NSData *data, NSError *error) { 
      NSString *val = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

      [self.txtResponse setString:val]; 
      //NSLog(val); 
     }; 

     [req setUrl:[[NSURL alloc] initWithString:@"http://foo.bar"]]; 

     [req setCallback:callback]; 

     [req send]; 
    } 
} 

,當我嘗試使用[self.txtResponse setString:val];的UI凍結
我也試過沒有@synchronized(self)
W這是問題嗎?
在此先感謝!

+0

你確定'val'不是零3天?在將其設置爲文本視圖之前,請嘗試打印它。 – TheAmateurProgrammer

+0

它沒有@synchronize凍結?我問,因爲這聽起來像是遇到了僵局。 – Jeremy

+0

@TheAmateurProgrammer是的,我用'NSLog'來顯示內容 –

回答

0

,我用Objective-C的工作,終於找到了答案:)

我用performSelectorOnMainThread和解決的問題

- (IBAction)sendReq:(id)sender { 

    request *req = [[request alloc] init]; 

    voidCallback callback = ^(NSURLResponse *resp, NSData *data, NSError *error) { 
     NSString *val = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

     [self performSelectorOnMainThread:@selector(setResponseValue:) withObject:val waitUntilDone:NO]; 
    }; 

    [req setUrl:[[NSURL alloc] initWithString:@"http://programming.com"]]; 

    [req setCallback:callback]; 

    [req send]; 
} 

- (void)setResponseValue:(NSString *)resp 
{ 
    [self.txtResponse setString:resp]; 
    //NSLog(resp); 
} 
+0

稍微好一點是'dispatch_async(dispatch_get_main_queue(),^ {...});'從塊內部(不需要中間方法) – trojanfoe

+0

@trojanfoe請完全回答,而不是一點點評論:) –

相關問題