2013-01-16 44 views
0

我有一個線程可以調用我的許多接口函數。當它調用時我需要執行一些GUI操作,因爲我知道GUI需要在主線程中完成,現在我用如何在線程中執行GUI操作 - IOS

  dispatch_async(dispatch_get_main_queue(), ^{ 
       // Some method call... 
      }); 

它適用於大多數的情況下,還是我在這裏面臨的問題。對於如..我的接口功能,就像下面...

 void interface_fun(char *name, int user_id) { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        gui_acton_with_name(name, user_id); 
       }); 
     } 

現在名字指針是我在調度調用中得到零的大部分時間(我想我在這裏丟失數據),我試着用performselectoronMainthread方法..但我不知道如何與多個參數用這個..

任何想法,感謝..

回答

1

我張貼這是一個答案,因爲它太難把這個變成一個評論,但如果你使用performSelectorOnMainThread:withObject:waitUntilDone:可以的信息,請兩位包裝成一個字典(或一個數組,而是一個字典工作得更好,因爲你可以訪問名稱的信息):

NSDictionary *info = @{ @"name" : @(name), @"user_id", @(user_id) }; 
[self performSelectorOnMainThread:@selector(someMethod:) withObject:info waitUntilDone:NO]; 

然後在你的方法(iOS 6中僅除非你回到老學校objectForKey:):

- (void) someMethod:(NSDictionary *) info 
{ 
    NSString *name = info[@"name"]; 
    NSNumber *user_id = info[@"user_id"]; 

    // unbox name and user_id if necessary 
} 
+0

@dramlax感謝您的回覆..有了這些變化,是否有可能丟失上述數據。 – Newbee

+1

如果你用'@(name)'把'name'加入到一個NSString中,並且存儲在一個字典中,那麼你將不會丟失數據,因爲它會爲你創建一個副本。 – dreamlax

1

您的問題可能是在interface_fun返回後,name指向的對象已被釋放。

您應該將name複製到局部變量,然後在塊的末尾釋放該變量。 (如果您使用ARC,則自動)。事情是這樣的:

NSData *data = [NSData dataWithBytes:name length:strlen(name)+1]; 
dispatch_async(dispatch_get_main_queue(), ^{ 
    gui_acton_with_name((char*)[data bytes], user_id); 
}); 

如果使用ARC,你也可以通過在nameNSString*NSData*。在這種情況下,內容將被保留,直到您的塊完成。